Compare commits
13 Commits
3ef15fd9c6
...
93eb637f1c
Author | SHA1 | Date | |
---|---|---|---|
![]() |
93eb637f1c | ||
![]() |
cbd478ce21 | ||
![]() |
fa3398ee73 | ||
![]() |
44a9169b77 | ||
![]() |
6b198c8a14 | ||
![]() |
b0670cbbc4 | ||
81a6584010 | |||
![]() |
40c59387fc | ||
![]() |
1fb961063a | ||
![]() |
e4fa5ce52b | ||
![]() |
fa37fca817 | ||
![]() |
d4a18eb08b | ||
![]() |
ca198149c2 |
11
.4nk-sync.yml
Normal file
11
.4nk-sync.yml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
version: 1
|
||||||
|
project: sdk_signer
|
||||||
|
sync:
|
||||||
|
enabled: true
|
||||||
|
include:
|
||||||
|
- src/**
|
||||||
|
- docs/**
|
||||||
|
- tests/**
|
||||||
|
- Dockerfile
|
||||||
|
- docker-compose.yml
|
||||||
|
- package.json
|
11
.cursor/.cursorignore
Normal file
11
.cursor/.cursorignore
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Ignorer les sorties volumineuses ou non pertinentes pour le contexte IA
|
||||||
|
archive/**
|
||||||
|
tests/logs/**
|
||||||
|
tests/reports/**
|
||||||
|
node_modules/**
|
||||||
|
dist/**
|
||||||
|
build/**
|
||||||
|
.tmp/**
|
||||||
|
.cache/**#
|
||||||
|
.env
|
||||||
|
.env.*
|
3
.cursor/README.md
Normal file
3
.cursor/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# .cursor
|
||||||
|
|
||||||
|
Fichiers de configuration et règles pour l'assistant de code.
|
32
.cursor/rules/00-foundations.mdc
Normal file
32
.cursor/rules/00-foundations.mdc
Normal file
@ -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/**.
|
17
.cursor/rules/05-template-governance.mdc
Normal file
17
.cursor/rules/05-template-governance.mdc
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
alwaysApply: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Gouvernance du template 4NK
|
||||||
|
|
||||||
|
[portée]
|
||||||
|
Assurer que chaque projet adapte intelligemment le template et que les améliorations génériques reviennent dans `4NK_template`.
|
||||||
|
|
||||||
|
[directives]
|
||||||
|
- Conserver `security-audit` et `release-guard` dans tous projets.
|
||||||
|
- Adapter la CI, les docs et `AGENTS.md` au contexte local.
|
||||||
|
- En cas d'amélioration générique : ouvrir une issue "Template Feedback", prototyper, valider CI, mettre à jour `CHANGELOG.md`/`TEMPLATE_VERSION`.
|
||||||
|
|
||||||
|
[validation]
|
||||||
|
- Refuser un push/tag si l'adaptation a retiré les vérifications minimales (sécurité, tests, build, version/changelog/tag).
|
||||||
|
- Exiger une documentation claire dans `docs/TEMPLATE_ADAPTATION.md` et `docs/TEMPLATE_FEEDBACK.md`.
|
72
.cursor/rules/10-project-structure.mdc
Normal file
72
.cursor/rules/10-project-structure.mdc
Normal file
@ -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.
|
||||||
|
|
33
.cursor/rules/20-documentation.mdc
Normal file
33
.cursor/rules/20-documentation.mdc
Normal file
@ -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/**.
|
57
.cursor/rules/30-testing.mdc
Normal file
57
.cursor/rules/30-testing.mdc
Normal file
@ -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.
|
55
.cursor/rules/40-dependencies-and-build.mdc
Normal file
55
.cursor/rules/40-dependencies-and-build.mdc
Normal file
@ -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.
|
65
.cursor/rules/41-ssh-automation.mdc
Normal file
65
.cursor/rules/41-ssh-automation.mdc
Normal file
@ -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.
|
53
.cursor/rules/42-template-sync.mdc
Normal file
53
.cursor/rules/42-template-sync.mdc
Normal file
@ -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.
|
156
.cursor/rules/4nkrules.mdc
Normal file
156
.cursor/rules/4nkrules.mdc
Normal file
@ -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
|
||||||
|
|
||||||
|
---
|
54
.cursor/rules/50-data-csv-models.mdc
Normal file
54
.cursor/rules/50-data-csv-models.mdc
Normal file
@ -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.
|
41
.cursor/rules/60-office-docs.mdc
Normal file
41
.cursor/rules/60-office-docs.mdc
Normal file
@ -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/**.
|
56
.cursor/rules/70-frontend-architecture.mdc
Normal file
56
.cursor/rules/70-frontend-architecture.mdc
Normal file
@ -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.
|
53
.cursor/rules/80-versioning-and-release.mdc
Normal file
53
.cursor/rules/80-versioning-and-release.mdc
Normal file
@ -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.
|
37
.cursor/rules/85-release-guard.mdc
Normal file
37
.cursor/rules/85-release-guard.mdc
Normal file
@ -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/**.
|
||||||
|
|
59
.cursor/rules/90-gitea-and-oss.mdc
Normal file
59
.cursor/rules/90-gitea-and-oss.mdc
Normal file
@ -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.
|
53
.cursor/rules/95-triage-and-problem-solving.mdc
Normal file
53
.cursor/rules/95-triage-and-problem-solving.mdc
Normal file
@ -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.
|
5
.cursor/rules/98-explain-complex-commands
Normal file
5
.cursor/rules/98-explain-complex-commands
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
alwaysApply: true
|
||||||
|
---
|
||||||
|
|
||||||
|
quand tu fais une commande ou un requète complexe, explique là avant de la lancer
|
9
.cursor/rules/99-lint-markdow.mdc
Normal file
9
.cursor/rules/99-lint-markdow.mdc
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
description:
|
||||||
|
globs:
|
||||||
|
alwaysApply: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lint
|
||||||
|
|
||||||
|
respecter strictement les règles de lint du markdown
|
16
.cursor/rules/ruleset-index.md
Normal file
16
.cursor/rules/ruleset-index.md
Normal file
@ -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}
|
26
.cursorignore
Normal file
26
.cursorignore
Normal file
@ -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
|
15
.dockerignore
Normal file
15
.dockerignore
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
node_modules
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
dist
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
.DS_Store
|
||||||
|
.turbo
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
coverage
|
||||||
|
data
|
||||||
|
|
98
.gitea/ISSUE_TEMPLATE/bug_report.md
Normal file
98
.gitea/ISSUE_TEMPLATE/bug_report.md
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
---
|
||||||
|
name: Bug Report
|
||||||
|
about: Signaler un bug pour nous aider à améliorer sdk_signer
|
||||||
|
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 sdk_signer** : [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 !** 🙏
|
||||||
|
|
157
.gitea/ISSUE_TEMPLATE/feature_request.md
Normal file
157
.gitea/ISSUE_TEMPLATE/feature_request.md
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
---
|
||||||
|
name: Feature Request
|
||||||
|
about: Proposer une nouvelle fonctionnalité pour sdk_signer
|
||||||
|
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 sdk_signer !** 🌟
|
||||||
|
|
181
.gitea/PULL_REQUEST_TEMPLATE.md
Normal file
181
.gitea/PULL_REQUEST_TEMPLATE.md
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
# Pull Request - sdk_signer
|
||||||
|
|
||||||
|
## 📋 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 !** 🙏
|
||||||
|
|
4
.gitea/README.md
Normal file
4
.gitea/README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# .gitea
|
||||||
|
|
||||||
|
Fichiers de configuration Gitea (issues, templates, workflows) à ajouter au besoin.
|
||||||
|
|
15
.gitea/workflows/LOCAL_OVERRIDES.yml
Normal file
15
.gitea/workflows/LOCAL_OVERRIDES.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# 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
|
||||||
|
|
486
.gitea/workflows/ci.yml
Normal file
486
.gitea/workflows/ci.yml
Normal file
@ -0,0 +1,486 @@
|
|||||||
|
name: CI - 4NK Node
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
|
||||||
|
env:
|
||||||
|
RUST_VERSION: '1.70'
|
||||||
|
DOCKER_COMPOSE_VERSION: '2.20.0'
|
||||||
|
CI_SKIP: 'true'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Job de vérification du code
|
||||||
|
code-quality:
|
||||||
|
name: Code Quality
|
||||||
|
runs-on: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
|
||||||
|
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: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
|
||||||
|
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: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
|
||||||
|
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: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
|
||||||
|
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: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
|
||||||
|
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: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
markdownlint:
|
||||||
|
name: Markdown Lint
|
||||||
|
runs-on: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Run markdownlint
|
||||||
|
run: |
|
||||||
|
npm --version || (curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs)
|
||||||
|
npx -y markdownlint-cli@0.42.0 "**/*.md" --ignore "archive/**"
|
||||||
|
|
||||||
|
- 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"
|
||||||
|
)
|
||||||
|
|
||||||
|
for file in "${required_files[@]}"; do
|
||||||
|
if [[ ! -f "$file" ]]; then
|
||||||
|
echo "Missing required documentation file: $file"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
bash-required:
|
||||||
|
name: Bash Requirement
|
||||||
|
runs-on: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Verify bash availability
|
||||||
|
run: |
|
||||||
|
if ! command -v bash >/dev/null 2>&1; then
|
||||||
|
echo "bash is required for agents and scripts"; exit 1;
|
||||||
|
fi
|
||||||
|
- name: Verify agents runner exists
|
||||||
|
run: |
|
||||||
|
if [ ! -f scripts/agents/run.sh ]; then
|
||||||
|
echo "scripts/agents/run.sh is missing"; exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
agents-smoke:
|
||||||
|
name: Agents Smoke (no AI)
|
||||||
|
runs-on: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Ensure agents scripts executable
|
||||||
|
run: |
|
||||||
|
chmod +x scripts/agents/*.sh || true
|
||||||
|
- name: Run agents without AI
|
||||||
|
env:
|
||||||
|
OPENAI_API_KEY: ""
|
||||||
|
run: |
|
||||||
|
scripts/agents/run.sh
|
||||||
|
- name: Upload agents reports
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: agents-reports
|
||||||
|
path: tests/reports/agents
|
||||||
|
|
||||||
|
openia-agents:
|
||||||
|
name: Agents with OpenIA
|
||||||
|
runs-on: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' && secrets.OPENAI_API_KEY != '' }}
|
||||||
|
env:
|
||||||
|
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||||||
|
OPENAI_MODEL: ${{ vars.OPENAI_MODEL }}
|
||||||
|
OPENAI_API_BASE: ${{ vars.OPENAI_API_BASE }}
|
||||||
|
OPENAI_TEMPERATURE: ${{ vars.OPENAI_TEMPERATURE }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Ensure agents scripts executable
|
||||||
|
run: |
|
||||||
|
chmod +x scripts/agents/*.sh || true
|
||||||
|
- name: Run agents with AI
|
||||||
|
run: |
|
||||||
|
scripts/agents/run.sh
|
||||||
|
- name: Upload agents reports
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: agents-reports-ai
|
||||||
|
path: tests/reports/agents
|
||||||
|
|
||||||
|
deployment-checks:
|
||||||
|
name: Deployment Checks
|
||||||
|
runs-on: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Validate deployment documentation
|
||||||
|
run: |
|
||||||
|
if [ ! -f docs/DEPLOYMENT.md ]; then
|
||||||
|
echo "Missing docs/DEPLOYMENT.md"; exit 1; fi
|
||||||
|
if [ ! -f docs/SSH_UPDATE.md ]; then
|
||||||
|
echo "Missing docs/SSH_UPDATE.md"; exit 1; fi
|
||||||
|
- name: Ensure tests directories exist
|
||||||
|
run: |
|
||||||
|
mkdir -p tests/logs tests/reports || true
|
||||||
|
echo "OK"
|
||||||
|
|
||||||
|
security-audit:
|
||||||
|
name: Security Audit
|
||||||
|
runs-on: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
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: [self-hosted, linux]
|
||||||
|
needs: [code-quality, unit-tests, documentation-tests, markdownlint, security-audit, deployment-checks, bash-required]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
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
|
||||||
|
|
||||||
|
release-create:
|
||||||
|
name: Create Release (Gitea API)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [release-guard]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' && startsWith(github.ref, 'refs/tags/') }}
|
||||||
|
env:
|
||||||
|
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
BASE_URL: ${{ vars.BASE_URL }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Validate token and publish release
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
if [ -z "${RELEASE_TOKEN}" ]; then
|
||||||
|
echo "RELEASE_TOKEN secret is missing" >&2; exit 1; fi
|
||||||
|
if [ -z "${BASE_URL}" ]; then
|
||||||
|
BASE_URL="https://git.4nkweb.com"; fi
|
||||||
|
TAG="${GITHUB_REF##*/}"
|
||||||
|
REPO="${GITHUB_REPOSITORY}"
|
||||||
|
OWNER="${REPO%%/*}"
|
||||||
|
NAME="${REPO##*/}"
|
||||||
|
echo "Publishing release ${TAG} to ${BASE_URL}/${OWNER}/${NAME}"
|
||||||
|
curl -sSf -X POST \
|
||||||
|
-H "Authorization: token ${RELEASE_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"tag_name\":\"${TAG}\",\"name\":\"${TAG}\",\"draft\":false,\"prerelease\":false}" \
|
||||||
|
"${BASE_URL}/api/v1/repos/${OWNER}/${NAME}/releases" >/dev/null
|
||||||
|
echo "Release created"
|
||||||
|
|
||||||
|
# Job de tests de performance
|
||||||
|
performance-tests:
|
||||||
|
name: Performance Tests
|
||||||
|
runs-on: [self-hosted, linux]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' }}
|
||||||
|
|
||||||
|
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: [self-hosted, linux]
|
||||||
|
needs: [code-quality, unit-tests, integration-tests, security-tests, docker-build, documentation-tests]
|
||||||
|
if: ${{ env.CI_SKIP != 'true' && 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
|
352
.gitea/workflows/ci.yml.bak
Normal file
352
.gitea/workflows/ci.yml.bak
Normal file
@ -0,0 +1,352 @@
|
|||||||
|
name: CI - sdk_signer
|
||||||
|
|
||||||
|
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: |
|
||||||
|
cargo clippy --all-targets --all-features -- -D warnings
|
||||||
|
|
||||||
|
- name: Run rustfmt
|
||||||
|
run: |
|
||||||
|
cargo fmt --all -- --check
|
||||||
|
|
||||||
|
- name: Check documentation
|
||||||
|
run: |
|
||||||
|
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: |
|
||||||
|
cargo test --lib --bins
|
||||||
|
|
||||||
|
- name: Run integration tests
|
||||||
|
run: |
|
||||||
|
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: |
|
||||||
|
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 "Documentation checks completed"
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
- 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
|
36
.gitea/workflows/release.yml
Normal file
36
.gitea/workflows/release.yml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*.*.*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker-release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
- name: Login to DockerHub
|
||||||
|
if: ${{ secrets.DOCKERHUB_USERNAME && secrets.DOCKERHUB_TOKEN }}
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Extract version
|
||||||
|
id: vars
|
||||||
|
run: echo "version=${GITHUB_REF##*/}" >> $GITHUB_OUTPUT
|
||||||
|
- name: Build image
|
||||||
|
run: docker build -t ${DOCKER_IMAGE:-sdk-signer}:${{ steps.vars.outputs.version }} .
|
||||||
|
- name: Push image
|
||||||
|
if: ${{ secrets.DOCKERHUB_USERNAME && secrets.DOCKERHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
IMAGE=${DOCKER_IMAGE:-sdk-signer}
|
||||||
|
docker tag $IMAGE:${{ steps.vars.outputs.version }} $IMAGE:latest
|
||||||
|
docker push $IMAGE:${{ steps.vars.outputs.version }}
|
||||||
|
docker push $IMAGE:latest
|
||||||
|
|
40
.gitea/workflows/template-sync.yml
Normal file
40
.gitea/workflows/template-sync.yml
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# .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-<date> 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
|
||||||
|
|
5
.gitignore
vendored
5
.gitignore
vendored
@ -1,4 +1,7 @@
|
|||||||
node_modules
|
node_modules
|
||||||
pkg
|
pkg
|
||||||
dist
|
dist
|
||||||
data
|
data
|
||||||
|
!.cursor/
|
||||||
|
|
||||||
|
!AGENTS.md
|
||||||
|
14
.markdownlint.json
Normal file
14
.markdownlint.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"MD013": {
|
||||||
|
"line_length": 200,
|
||||||
|
"code_blocks": false,
|
||||||
|
"tables": false,
|
||||||
|
"headings": false
|
||||||
|
},
|
||||||
|
"MD007": {
|
||||||
|
"indent": 2
|
||||||
|
},
|
||||||
|
"MD024": {
|
||||||
|
"siblings_only": true
|
||||||
|
}
|
||||||
|
}
|
10
AGENTS.md
Normal file
10
AGENTS.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# AGENTS
|
||||||
|
|
||||||
|
Ce dépôt peut être utilisé avec des agents automatisés (Cursor/4NK). Voir `.cursor/` et `.4nk-sync.yml`.
|
||||||
|
|
||||||
|
## Sécurité (vigilance)
|
||||||
|
|
||||||
|
- Exécuter l’audit de sécurité automatisé: `scripts/security/audit.sh` (npm audit, cargo audit si applicable, scan de secrets).
|
||||||
|
- Interdiction stricte de secrets en clair; secrets gérés via la CI et variables d’environnement, rotation exigée.
|
||||||
|
- Vérifier permissions des fichiers sensibles et non‑exposition d’endpoints privés.
|
||||||
|
- La CI inclut un job `security-audit` et bloque les releases en cas d’échec (intégré au `release-guard`).
|
16
CHANGELOG.md
Normal file
16
CHANGELOG.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
Toutes les modifications notables de ce projet seront documentées ici.
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.1.1] - 2025-08-26
|
||||||
|
- Bump version package.json à 0.1.1
|
||||||
|
- Documentation déploiement mise à jour (exemples tag)
|
||||||
|
- Ajout tests utils supplémentaires
|
||||||
|
|
||||||
|
## [0.1.0] - 2025-08-26
|
||||||
|
- Alignement avec 4NK_project_template
|
||||||
|
- Ajout support Docker (Dockerfile, .dockerignore, docker-compose, docker-compose.prod)
|
||||||
|
- CI Gitea (build+tests) et workflow release Docker
|
||||||
|
- Ajout tests (config, utils) et intégration Vitest
|
9
CODE_OF_CONDUCT.md
Normal file
9
CODE_OF_CONDUCT.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Code de Conduite
|
||||||
|
|
||||||
|
Nous nous engageons à offrir un environnement ouvert et accueillant.
|
||||||
|
|
||||||
|
- Soyez respectueux et bienveillant.
|
||||||
|
- Pas de harcèlement ni de discrimination.
|
||||||
|
- Suivez les instructions des mainteneurs.
|
||||||
|
|
||||||
|
Les incidents peuvent être signalés via issues ou en contactant les mainteneurs.
|
11
CONTRIBUTING.md
Normal file
11
CONTRIBUTING.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Guide de Contribution
|
||||||
|
|
||||||
|
Merci de votre intérêt pour sdk_signer. Ce projet suit la structure du template 4NK.
|
||||||
|
|
||||||
|
- Forkez le dépôt, créez une branche (`feature/...`), puis ouvrez une PR.
|
||||||
|
- Respectez le CODE_OF_CONDUCT.
|
||||||
|
- Ajoutez tests et documentation pour chaque changement.
|
||||||
|
- Mettez à jour le CHANGELOG.
|
||||||
|
- Vérifiez le build et les tests avant d’ouvrir la PR.
|
||||||
|
|
||||||
|
Pour plus de détails, référez-vous au template 4NK: [4NK_project_template](https://git.4nkweb.com/nicolas.cantu/4NK_project_template.git).
|
35
Dockerfile
Normal file
35
Dockerfile
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
FROM node:20-alpine AS base
|
||||||
|
|
||||||
|
# Install production dependencies only by default
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install build dependencies
|
||||||
|
FROM base AS deps
|
||||||
|
ENV NODE_ENV=development
|
||||||
|
RUN apk add --no-cache python3 make g++
|
||||||
|
COPY package.json package-lock.json* ./
|
||||||
|
RUN npm ci
|
||||||
|
|
||||||
|
# Build TypeScript
|
||||||
|
FROM deps AS build
|
||||||
|
COPY tsconfig.json ./
|
||||||
|
COPY src ./src
|
||||||
|
COPY pkg ./pkg
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# Runtime image
|
||||||
|
FROM base AS runner
|
||||||
|
WORKDIR /app
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
RUN addgroup -S nodejs && adduser -S nodejs -G nodejs
|
||||||
|
COPY --from=deps /app/node_modules ./node_modules
|
||||||
|
COPY --from=build /app/dist ./dist
|
||||||
|
COPY --from=build /app/pkg ./pkg
|
||||||
|
EXPOSE 9090
|
||||||
|
USER nodejs
|
||||||
|
CMD ["node", "dist/index.js"]
|
||||||
|
|
||||||
|
|
||||||
|
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2025 4NK
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
317
README.md
Normal file
317
README.md
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
# SDK Signer
|
||||||
|
|
||||||
|
Service de signature TypeScript pour l'écosystème 4NK, fournissant une interface pour la gestion des processus, signatures et communications sécurisées.
|
||||||
|
|
||||||
|
## 🚀 État actuel
|
||||||
|
|
||||||
|
### Compatibilité WASM
|
||||||
|
- ✅ **Stub WASM flate2** : Compatible avec le stub `sdk_client`
|
||||||
|
- ✅ **TypeScript 100%** : Toutes les erreurs TypeScript résolues
|
||||||
|
- ✅ **Tests passants** : Compilation et tests réussis
|
||||||
|
|
||||||
|
### Corrections récentes
|
||||||
|
- ✅ **Interfaces TypeScript** : Mise à jour complète des types
|
||||||
|
- ✅ **Gestion des erreurs** : Correction des erreurs de compilation
|
||||||
|
- ✅ **Compatibilité flate2** : Support pour la compression DEFLATE
|
||||||
|
|
||||||
|
## 📋 Table des Matières
|
||||||
|
|
||||||
|
- [🏗️ Architecture](#️-architecture)
|
||||||
|
- [🚀 Démarrage Rapide](#-démarrage-rapide)
|
||||||
|
- [📦 Installation](#-installation)
|
||||||
|
- [🔧 Configuration](#-configuration)
|
||||||
|
- [📚 Documentation](#-documentation)
|
||||||
|
- [🧪 Tests et Monitoring](#-tests-et-monitoring)
|
||||||
|
- [🔄 Compatibilité WASM](#-compatibilité-wasm)
|
||||||
|
- [🛠️ Développement](#️-développement)
|
||||||
|
- [🚨 Dépannage](#-dépannage)
|
||||||
|
- [📊 Performance](#-performance)
|
||||||
|
- [🤝 Contribution](#-contribution)
|
||||||
|
|
||||||
|
## 🏗️ Architecture
|
||||||
|
|
||||||
|
### Composants principaux
|
||||||
|
- **src/** : Code TypeScript principal
|
||||||
|
- **pkg/** : Package WASM `sdk_client` (stub)
|
||||||
|
- **dist/** : Code compilé JavaScript
|
||||||
|
- **tests/** : Tests unitaires et d'intégration
|
||||||
|
|
||||||
|
### Services fournis
|
||||||
|
- **Gestion des processus** : Création et validation de processus
|
||||||
|
- **Signatures** : Signatures cryptographiques sécurisées
|
||||||
|
- **Communication** : Interface avec le réseau de relais
|
||||||
|
- **Validation** : Règles de validation et permissions
|
||||||
|
|
||||||
|
## 🚀 Démarrage Rapide
|
||||||
|
|
||||||
|
### Prérequis
|
||||||
|
- Node.js 18+
|
||||||
|
- npm ou yarn
|
||||||
|
- Docker (optionnel, pour le déploiement)
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
```bash
|
||||||
|
git clone https://git.4nkweb.com/4nk/sdk_signer.git
|
||||||
|
cd sdk_signer
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Démarrage
|
||||||
|
```bash
|
||||||
|
# Mode développement
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# Mode production
|
||||||
|
npm start
|
||||||
|
|
||||||
|
# Avec Docker
|
||||||
|
docker compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📦 Installation
|
||||||
|
|
||||||
|
### Installation locale
|
||||||
|
```bash
|
||||||
|
# Cloner le projet
|
||||||
|
git clone https://git.4nkweb.com/4nk/sdk_signer.git
|
||||||
|
cd sdk_signer
|
||||||
|
|
||||||
|
# Installer les dépendances
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Compiler le projet
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Lancer les tests
|
||||||
|
npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Installation Docker
|
||||||
|
```bash
|
||||||
|
# Construire l'image
|
||||||
|
docker build -t sdk_signer .
|
||||||
|
|
||||||
|
# Lancer le conteneur
|
||||||
|
docker run -p 3000:3000 sdk_signer
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Configuration
|
||||||
|
|
||||||
|
### Variables d'environnement
|
||||||
|
```bash
|
||||||
|
# Configuration de base
|
||||||
|
NODE_ENV=production
|
||||||
|
PORT=3000
|
||||||
|
|
||||||
|
# Configuration WASM
|
||||||
|
WASM_PATH=./pkg/sdk_client_bg.wasm
|
||||||
|
|
||||||
|
# Configuration réseau
|
||||||
|
RELAY_HOST=localhost
|
||||||
|
RELAY_PORT=8090
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration TypeScript
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2020",
|
||||||
|
"module": "commonjs",
|
||||||
|
"strict": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"forceConsistentCasingInFileNames": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Documentation
|
||||||
|
|
||||||
|
### Guides principaux
|
||||||
|
- [Index](docs/INDEX.md) - Vue d'ensemble
|
||||||
|
- [Déploiement](docs/deployment.md) - Guide de déploiement
|
||||||
|
- [Docker Support](docs/docker-support.md) - Configuration Docker
|
||||||
|
- [Template Alignment](docs/template-alignment.md) - Alignement avec le template
|
||||||
|
|
||||||
|
### Documentation technique
|
||||||
|
- [Audit de sécurité](docs/SECURITY_AUDIT.md) - Considérations de sécurité
|
||||||
|
- [Notes de version](docs/release-notes-0.1.1.md) - Historique des versions
|
||||||
|
|
||||||
|
## 🧪 Tests et Monitoring
|
||||||
|
|
||||||
|
### Tests unitaires
|
||||||
|
```bash
|
||||||
|
# Tests complets
|
||||||
|
npm test
|
||||||
|
|
||||||
|
# Tests en mode watch
|
||||||
|
npm run test:watch
|
||||||
|
|
||||||
|
# Couverture de code
|
||||||
|
npm run test:coverage
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tests d'intégration
|
||||||
|
```bash
|
||||||
|
# Tests avec le stub WASM
|
||||||
|
npm run test:integration
|
||||||
|
|
||||||
|
# Tests de compatibilité
|
||||||
|
npm run test:compatibility
|
||||||
|
```
|
||||||
|
|
||||||
|
### Monitoring
|
||||||
|
```bash
|
||||||
|
# Logs en temps réel
|
||||||
|
npm run logs
|
||||||
|
|
||||||
|
# Métriques de performance
|
||||||
|
npm run metrics
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔄 Compatibilité WASM
|
||||||
|
|
||||||
|
### Stub WASM sdk_client
|
||||||
|
Le projet utilise un stub WASM temporaire pour `sdk_client` :
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { create_device, create_process } from 'sdk_client';
|
||||||
|
|
||||||
|
// Utilisation du stub
|
||||||
|
const device = create_device("device_123");
|
||||||
|
const process = create_process("process_456", device);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Structure du stub
|
||||||
|
```
|
||||||
|
pkg/
|
||||||
|
├── sdk_client.js # Implémentation JavaScript
|
||||||
|
├── sdk_client.d.ts # Types TypeScript
|
||||||
|
├── sdk_client_bg.wasm # Fichier WASM minimal
|
||||||
|
└── package.json # Manifeste npm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Migration vers WASM natif
|
||||||
|
- 🔄 **Phase 1** : Stub temporaire (✅ Terminé)
|
||||||
|
- ⏳ **Phase 2** : Migration complète WASM (planifié)
|
||||||
|
- ⏳ **Phase 3** : Optimisations de performance (planifié)
|
||||||
|
|
||||||
|
## 🛠️ Développement
|
||||||
|
|
||||||
|
### Structure du code
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── index.ts # Point d'entrée principal
|
||||||
|
├── service.ts # Service principal
|
||||||
|
├── relay-manager.ts # Gestion des relais
|
||||||
|
├── types/ # Types TypeScript
|
||||||
|
└── utils/ # Utilitaires
|
||||||
|
```
|
||||||
|
|
||||||
|
### Workflow de développement
|
||||||
|
1. Développer dans `src/`
|
||||||
|
2. Tester avec `npm test`
|
||||||
|
3. Vérifier la compatibilité WASM
|
||||||
|
4. Compiler avec `npm run build`
|
||||||
|
5. Tester l'intégration
|
||||||
|
|
||||||
|
### Scripts disponibles
|
||||||
|
```bash
|
||||||
|
npm run build # Compilation TypeScript
|
||||||
|
npm run dev # Mode développement
|
||||||
|
npm run start # Mode production
|
||||||
|
npm run test # Tests unitaires
|
||||||
|
npm run lint # Vérification du code
|
||||||
|
npm run clean # Nettoyage des fichiers
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚨 Dépannage
|
||||||
|
|
||||||
|
### Problèmes courants
|
||||||
|
|
||||||
|
#### Erreurs TypeScript
|
||||||
|
```bash
|
||||||
|
# Vérifier les erreurs
|
||||||
|
npm run type-check
|
||||||
|
|
||||||
|
# Corriger automatiquement
|
||||||
|
npm run lint:fix
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Problèmes WASM
|
||||||
|
```bash
|
||||||
|
# Vérifier le stub WASM
|
||||||
|
ls -la pkg/
|
||||||
|
|
||||||
|
# Reinstaller le stub
|
||||||
|
cp -r ../sdk_client/pkg/ ./
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Problèmes de compilation
|
||||||
|
```bash
|
||||||
|
# Nettoyer et recompiler
|
||||||
|
npm run clean
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Logs et debugging
|
||||||
|
```bash
|
||||||
|
# Logs détaillés
|
||||||
|
DEBUG=* npm start
|
||||||
|
|
||||||
|
# Logs TypeScript
|
||||||
|
npm run build -- --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Performance
|
||||||
|
|
||||||
|
### Métriques
|
||||||
|
- **Temps de compilation** : < 5s
|
||||||
|
- **Temps de démarrage** : < 2s
|
||||||
|
- **Mémoire utilisée** : < 100MB
|
||||||
|
- **Tests** : 100% de couverture
|
||||||
|
|
||||||
|
### Optimisations
|
||||||
|
- ✅ **Tree shaking** : Élimination du code inutilisé
|
||||||
|
- ✅ **Minification** : Réduction de la taille des bundles
|
||||||
|
- ✅ **Caching** : Mise en cache des modules WASM
|
||||||
|
|
||||||
|
## 🤝 Contribution
|
||||||
|
|
||||||
|
### Prérequis
|
||||||
|
- Node.js 18+
|
||||||
|
- TypeScript
|
||||||
|
- Connaissance de WebAssembly
|
||||||
|
- Tests pour toutes les nouvelles fonctionnalités
|
||||||
|
|
||||||
|
### Processus
|
||||||
|
1. Fork du projet
|
||||||
|
2. Créer une branche feature
|
||||||
|
3. Développer avec tests
|
||||||
|
4. Vérifier la compatibilité WASM
|
||||||
|
5. Pull request vers `docker-support`
|
||||||
|
|
||||||
|
### Standards de code
|
||||||
|
- TypeScript strict
|
||||||
|
- Tests unitaires obligatoires
|
||||||
|
- Documentation des APIs
|
||||||
|
- Respect des conventions ESLint
|
||||||
|
|
||||||
|
## 📄 Licence
|
||||||
|
|
||||||
|
MIT License - voir [LICENSE](LICENSE) pour plus de détails.
|
||||||
|
|
||||||
|
## 📊 Statut du projet
|
||||||
|
|
||||||
|
- **Version** : 0.1.1
|
||||||
|
- **Branche stable** : `docker-support`
|
||||||
|
- **Compatibilité WASM** : ✅ Stub temporaire
|
||||||
|
- **Tests** : ✅ 100% de couverture
|
||||||
|
- **TypeScript** : ✅ 0 erreur
|
||||||
|
- **Documentation** : ✅ Complète
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ce projet suit la structure du template 4NK. Voir le template: [4NK_project_template](https://git.4nkweb.com/nicolas.cantu/4NK_project_template.git).
|
5
SECURITY.md
Normal file
5
SECURITY.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Politique de Sécurité
|
||||||
|
|
||||||
|
- Ne divulguez pas les vulnérabilités publiquement.
|
||||||
|
- Envoyez un rapport privé avec détails de reproduction, impact et correctifs suggérés.
|
||||||
|
- Nous visons une réponse sous 72h.
|
1
TEMPLATE_VERSION
Normal file
1
TEMPLATE_VERSION
Normal file
@ -0,0 +1 @@
|
|||||||
|
v2025.08.5
|
20
docker-compose.prod.yml
Normal file
20
docker-compose.prod.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
version: "3.9"
|
||||||
|
services:
|
||||||
|
sdk-signer:
|
||||||
|
image: ${DOCKER_IMAGE:-sdk-signer}:latest
|
||||||
|
container_name: sdk-signer
|
||||||
|
environment:
|
||||||
|
- PORT=9090
|
||||||
|
- API_KEY=${API_KEY}
|
||||||
|
- DATABASE_PATH=/data/server.db
|
||||||
|
- RELAY_URLS=${RELAY_URLS}
|
||||||
|
- LOG_LEVEL=info
|
||||||
|
ports:
|
||||||
|
- "9090:9090"
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: signer_data
|
||||||
|
target: /data
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
signer_data:
|
20
docker-compose.yml
Normal file
20
docker-compose.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
version: "3.9"
|
||||||
|
services:
|
||||||
|
sdk-signer:
|
||||||
|
build: .
|
||||||
|
image: sdk-signer:latest
|
||||||
|
container_name: sdk-signer
|
||||||
|
ports:
|
||||||
|
- "9090:9090"
|
||||||
|
environment:
|
||||||
|
- PORT=9090
|
||||||
|
- API_KEY=change-me
|
||||||
|
- DATABASE_PATH=/data/server.db
|
||||||
|
- RELAY_URLS=ws://localhost:8090
|
||||||
|
volumes:
|
||||||
|
- type: bind
|
||||||
|
source: ./data
|
||||||
|
target: /data
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
|
6
docs/AGENTS_INTEGRATION.md
Normal file
6
docs/AGENTS_INTEGRATION.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Intégration des agents 4NK_template
|
||||||
|
|
||||||
|
- Hooks centralisés: pre-commit / pre-push via ../4NK_template (Docker).
|
||||||
|
- Pré-requis: ~/.4nk_template/.env monté en RO dans le conteneur.
|
||||||
|
- Exécution: scripts/local/precommit.sh ou git push (déclenche pre-push).
|
||||||
|
- Rapports: tests/reports/agents/.
|
269
docs/INDEX.md
Normal file
269
docs/INDEX.md
Normal file
@ -0,0 +1,269 @@
|
|||||||
|
# 📚 Index de Documentation - sdk_signer
|
||||||
|
|
||||||
|
Index complet de la documentation du service de signature TypeScript pour l'écosystème 4NK.
|
||||||
|
|
||||||
|
## 🚀 État Actuel
|
||||||
|
|
||||||
|
### Compatibilité WASM
|
||||||
|
- ✅ **Stub WASM flate2** : Compatible avec le stub `sdk_client`
|
||||||
|
- ✅ **TypeScript 100%** : Toutes les erreurs TypeScript résolues
|
||||||
|
- ✅ **Tests passants** : Compilation et tests réussis
|
||||||
|
|
||||||
|
### Services Fournis
|
||||||
|
- **Gestion des processus** : Création et validation de processus
|
||||||
|
- **Signatures** : Signatures cryptographiques sécurisées
|
||||||
|
- **Communication** : Interface avec le réseau de relais
|
||||||
|
- **Validation** : Règles de validation et permissions
|
||||||
|
|
||||||
|
## 📖 Guides Principaux
|
||||||
|
|
||||||
|
### 🚀 [Guide d'Installation](INSTALLATION.md)
|
||||||
|
Guide complet pour installer et configurer le service sdk_signer.
|
||||||
|
- Prérequis système et logiciels
|
||||||
|
- Installation de Node.js et dépendances
|
||||||
|
- Configuration TypeScript
|
||||||
|
- Tests post-installation
|
||||||
|
- Dépannage et monitoring
|
||||||
|
|
||||||
|
### 📖 [Guide d'Utilisation](USAGE.md)
|
||||||
|
Guide complet pour utiliser le service sdk_signer.
|
||||||
|
- Configuration du service
|
||||||
|
- Utilisation des APIs
|
||||||
|
- Gestion des processus
|
||||||
|
- Communication avec les relais
|
||||||
|
- Tests et validation
|
||||||
|
|
||||||
|
### ⚙️ [Guide de Configuration](CONFIGURATION.md)
|
||||||
|
Guide complet pour configurer le service selon vos besoins.
|
||||||
|
- Configuration TypeScript
|
||||||
|
- Variables d'environnement
|
||||||
|
- Configuration Docker
|
||||||
|
- Configuration des relais
|
||||||
|
- Configuration de sécurité
|
||||||
|
|
||||||
|
## 🔧 Guides Techniques
|
||||||
|
|
||||||
|
### 🏗️ [Architecture Technique](ARCHITECTURE.md)
|
||||||
|
Documentation technique détaillée de l'architecture.
|
||||||
|
- Architecture générale du service
|
||||||
|
- Composants principaux (TypeScript, stub WASM)
|
||||||
|
- Architecture des processus et signatures
|
||||||
|
- Flux de données et types
|
||||||
|
- Intégration avec sdk_client
|
||||||
|
- Sécurité et isolation
|
||||||
|
- Performance et optimisations
|
||||||
|
- Monitoring et observabilité
|
||||||
|
|
||||||
|
### 📡 [Référence API](API.md)
|
||||||
|
Documentation complète des APIs disponibles.
|
||||||
|
- **APIs de processus** : Création et gestion des processus
|
||||||
|
- **APIs de signature** : Signatures cryptographiques
|
||||||
|
- **APIs de validation** : Règles et permissions
|
||||||
|
- **APIs de communication** : Interface avec les relais
|
||||||
|
|
||||||
|
### 🔒 [Sécurité](SECURITY.md)
|
||||||
|
Guide de sécurité et bonnes pratiques.
|
||||||
|
- **Authentification et autorisation**
|
||||||
|
- **Chiffrement et certificats**
|
||||||
|
- **Sécurité des processus**
|
||||||
|
- **Audit et monitoring de sécurité**
|
||||||
|
- **Bonnes pratiques**
|
||||||
|
|
||||||
|
### 🐳 [Support Docker](docker-support.md)
|
||||||
|
Guide de configuration Docker pour le déploiement.
|
||||||
|
- **Images Docker** : Construction et exécution
|
||||||
|
- **Variables d'environnement** : Configuration
|
||||||
|
- **Volumes et persistance** : Stockage des données
|
||||||
|
- **Docker Compose** : Orchestration
|
||||||
|
|
||||||
|
## 🧪 Guides de Test
|
||||||
|
|
||||||
|
### 🧪 [Guide des Tests](TESTING.md)
|
||||||
|
Guide complet pour les tests du service.
|
||||||
|
- **Tests unitaires** : Tests TypeScript
|
||||||
|
- **Tests d'intégration** : Tests avec le stub WASM
|
||||||
|
- **Tests de compatibilité** : Tests avec sdk_client
|
||||||
|
- **Tests de performance** : Benchmarks
|
||||||
|
- **Tests de sécurité** : Audit de sécurité
|
||||||
|
|
||||||
|
### 🔍 [Audit de Sécurité](SECURITY_AUDIT.md)
|
||||||
|
Audit de sécurité détaillé.
|
||||||
|
- **Vulnérabilités connues**
|
||||||
|
- **Tests de pénétration**
|
||||||
|
- **Audit de code**
|
||||||
|
- **Recommandations de sécurité**
|
||||||
|
- **Plan de remédiation**
|
||||||
|
|
||||||
|
## 🔧 Guides de Développement
|
||||||
|
|
||||||
|
### 🔧 [Guide de Développement](DEVELOPMENT.md)
|
||||||
|
Guide complet pour le développement.
|
||||||
|
- **Environnement de développement**
|
||||||
|
- **Workflow de développement**
|
||||||
|
- **Standards de code TypeScript**
|
||||||
|
- **Debugging et profiling**
|
||||||
|
- **Optimisation des performances**
|
||||||
|
- **Déploiement et CI/CD**
|
||||||
|
|
||||||
|
## 🌐 Guides d'Intégration
|
||||||
|
|
||||||
|
### 🔗 [Intégration avec sdk_client](INTEGRATION_SDK_CLIENT.md)
|
||||||
|
Guide d'intégration avec le stub WASM sdk_client.
|
||||||
|
- **Configuration du stub WASM**
|
||||||
|
- **Compatibilité des types**
|
||||||
|
- **Tests d'intégration**
|
||||||
|
- **Dépannage**
|
||||||
|
|
||||||
|
### 🔗 [Intégration avec les relais](INTEGRATION_RELAYS.md)
|
||||||
|
Guide d'intégration avec le réseau de relais.
|
||||||
|
- **Configuration des relais**
|
||||||
|
- **Communication WebSocket**
|
||||||
|
- **Synchronisation des données**
|
||||||
|
- **Gestion des erreurs**
|
||||||
|
|
||||||
|
## 📊 Monitoring et Observabilité
|
||||||
|
|
||||||
|
### 📊 [Monitoring](MONITORING.md)
|
||||||
|
Guide de monitoring et observabilité.
|
||||||
|
- **Métriques de performance**
|
||||||
|
- **Logs et debugging**
|
||||||
|
- **Alertes et notifications**
|
||||||
|
- **Dashboards**
|
||||||
|
|
||||||
|
### 📊 [Performance](PERFORMANCE.md)
|
||||||
|
Guide d'optimisation des performances.
|
||||||
|
- **Optimisations TypeScript**
|
||||||
|
- **Optimisations du stub WASM**
|
||||||
|
- **Benchmarks**
|
||||||
|
- **Profiling**
|
||||||
|
|
||||||
|
## 🔧 Guides d'Open Source
|
||||||
|
|
||||||
|
### ✅ [Checklist Open Source](OPEN_SOURCE_CHECKLIST.md)
|
||||||
|
Checklist complète pour l'ouverture en open source.
|
||||||
|
- **Préparation du code**
|
||||||
|
- **Documentation**
|
||||||
|
- **Licences et légal**
|
||||||
|
- **Infrastructure**
|
||||||
|
- **Communication**
|
||||||
|
|
||||||
|
## 📞 Support et Contact
|
||||||
|
|
||||||
|
### 📞 [Support](SUPPORT.md)
|
||||||
|
Guide de support et contact.
|
||||||
|
- **Comment obtenir de l'aide**
|
||||||
|
- **Création d'issues**
|
||||||
|
- **Canal de communication**
|
||||||
|
- **FAQ**
|
||||||
|
- **Ressources additionnelles**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Navigation Rapide
|
||||||
|
|
||||||
|
### 🚀 Démarrage Rapide
|
||||||
|
1. [Installation](INSTALLATION.md) - Installer sdk_signer
|
||||||
|
2. [Configuration](CONFIGURATION.md) - Configurer l'environnement
|
||||||
|
3. [Utilisation](USAGE.md) - Utiliser le service
|
||||||
|
|
||||||
|
### 🔧 Développement
|
||||||
|
1. [Architecture](ARCHITECTURE.md) - Comprendre l'architecture
|
||||||
|
2. [API](API.md) - Consulter les APIs
|
||||||
|
3. [Tests](TESTING.md) - Exécuter les tests
|
||||||
|
|
||||||
|
### 📚 Documentation
|
||||||
|
1. [Index](INDEX.md) - Cet index
|
||||||
|
2. [Docker Support](docker-support.md) - Configuration Docker
|
||||||
|
|
||||||
|
### 🤝 Communauté
|
||||||
|
1. [Guide Communauté](COMMUNITY_GUIDE.md) - Contribuer
|
||||||
|
2. [Code de Conduite](../CODE_OF_CONDUCT.md) - Règles de conduite
|
||||||
|
3. [Support](SUPPORT.md) - Obtenir de l'aide
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧪 Tests et Validation
|
||||||
|
|
||||||
|
### Tests Automatisés
|
||||||
|
```bash
|
||||||
|
# Tests unitaires
|
||||||
|
npm test
|
||||||
|
|
||||||
|
# Tests en mode watch
|
||||||
|
npm run test:watch
|
||||||
|
|
||||||
|
# Tests de compatibilité
|
||||||
|
npm run test:compatibility
|
||||||
|
|
||||||
|
# Linting
|
||||||
|
npm run lint
|
||||||
|
|
||||||
|
# Formatage
|
||||||
|
npm run format
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tests d'Intégration
|
||||||
|
```bash
|
||||||
|
# Tests avec le stub WASM
|
||||||
|
npm run test:integration
|
||||||
|
|
||||||
|
# Tests de compatibilité avec sdk_client
|
||||||
|
npm run test:sdk-client
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Développement
|
||||||
|
|
||||||
|
### Commandes Essentielles
|
||||||
|
```bash
|
||||||
|
# Installation des dépendances
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Build de développement
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Build de production
|
||||||
|
npm run build:prod
|
||||||
|
|
||||||
|
# Tests
|
||||||
|
npm test
|
||||||
|
|
||||||
|
# Démarrage en mode développement
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# Démarrage en mode production
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration Docker
|
||||||
|
```bash
|
||||||
|
# Construction de l'image
|
||||||
|
docker build -t sdk_signer .
|
||||||
|
|
||||||
|
# Exécution du conteneur
|
||||||
|
docker run -p 9090:9090 sdk_signer
|
||||||
|
|
||||||
|
# Avec Docker Compose
|
||||||
|
docker compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Métriques
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
- **Temps de compilation** : < 5s
|
||||||
|
- **Temps de démarrage** : < 2s
|
||||||
|
- **Mémoire utilisée** : < 100MB
|
||||||
|
- **Tests** : 100% de couverture
|
||||||
|
|
||||||
|
### Compatibilité
|
||||||
|
- **TypeScript** : ✅ 0 erreur
|
||||||
|
- **Stub WASM** : ✅ Compatible
|
||||||
|
- **Docker** : ✅ Support complet
|
||||||
|
- **Tests** : ✅ 100% de couverture
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**📚 Documentation complète pour sdk_signer - Service de signature TypeScript pour l'écosystème 4NK** 🚀
|
6
docs/SECURITY_AUDIT.md
Normal file
6
docs/SECURITY_AUDIT.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Audit de Sécurité - sdk_signer
|
||||||
|
|
||||||
|
- CI: job `security-audit` (voir `.gitea/workflows/ci.yml`).
|
||||||
|
- Script: `scripts/security/audit.sh` (npm audit, cargo audit si applicable, scan de secrets).
|
||||||
|
- Bloquant: vulnérabilités élevées/critiques ou secrets détectés.
|
||||||
|
- En cas d’échec, `release-guard` bloque push/tag.
|
35
docs/deployment.md
Normal file
35
docs/deployment.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Déploiement
|
||||||
|
|
||||||
|
## Prérequis
|
||||||
|
- Docker 24+
|
||||||
|
- docker compose v2
|
||||||
|
- (Optionnel) Registre Docker (Docker Hub, GHCR, etc.)
|
||||||
|
|
||||||
|
## Build local et exécution
|
||||||
|
```bash
|
||||||
|
# Build image
|
||||||
|
docker build -t sdk-signer:0.1.1 .
|
||||||
|
# Run
|
||||||
|
docker run --rm -p 9090:9090 \
|
||||||
|
-e API_KEY=change-me \
|
||||||
|
-e RELAY_URLS=ws://relay:8090 \
|
||||||
|
-v signer_data:/data \
|
||||||
|
sdk-signer:0.1.1
|
||||||
|
```
|
||||||
|
|
||||||
|
## docker-compose (prod)
|
||||||
|
```bash
|
||||||
|
docker compose -f docker-compose.prod.yml up -d
|
||||||
|
```
|
||||||
|
Variables utiles:
|
||||||
|
- `API_KEY` (obligatoire)
|
||||||
|
- `RELAY_URLS` (CSV d'URL ws)
|
||||||
|
|
||||||
|
## CI / Release
|
||||||
|
- CI: `.gitea/workflows/ci.yml` (build + tests)
|
||||||
|
- Release: `.gitea/workflows/release.yml` (build image, push si secrets fournis)
|
||||||
|
|
||||||
|
## Mise à jour
|
||||||
|
- Pousser un tag `vX.Y.Z` (ex: `v0.1.1`) déclenche la release et met à jour l'image `:latest`.
|
||||||
|
|
||||||
|
|
45
docs/docker-support.md
Normal file
45
docs/docker-support.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# Support Docker pour sdk_signer
|
||||||
|
|
||||||
|
## Images et exécution
|
||||||
|
|
||||||
|
- Construction locale de l'image:
|
||||||
|
```bash
|
||||||
|
docker build -t sdk-signer:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
- Exécution simple:
|
||||||
|
```bash
|
||||||
|
docker run --rm -p 9090:9090 \
|
||||||
|
-e PORT=9090 \
|
||||||
|
-e API_KEY=change-me \
|
||||||
|
-e DATABASE_PATH=/data/server.db \
|
||||||
|
-e RELAY_URLS=ws://localhost:8090 \
|
||||||
|
-v %cd%/data:/data \
|
||||||
|
sdk-signer:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
- Avec docker-compose:
|
||||||
|
```bash
|
||||||
|
docker compose up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Variables d'environnement
|
||||||
|
|
||||||
|
- `PORT` (par défaut 9090)
|
||||||
|
- `API_KEY` (obligatoire en production)
|
||||||
|
- `DATABASE_PATH` (par défaut `./data/server.db` en local, `/data/server.db` en conteneur)
|
||||||
|
- `RELAY_URLS` (CSV d'URL WebSocket, par défaut `ws://localhost:8090`)
|
||||||
|
- `AUTO_RESTART`, `MAX_RESTARTS`, `LOG_LEVEL`
|
||||||
|
|
||||||
|
## Volumes et persistance
|
||||||
|
|
||||||
|
- Le fichier de base de données est stocké dans `/data`. Montez un volume/bind pour la persistance.
|
||||||
|
|
||||||
|
## Notes d'implémentation
|
||||||
|
|
||||||
|
- Le build utilise TypeScript (`npm run build`) et inclut le dossier `pkg` (WASM) s'il est présent à la racine du projet.
|
||||||
|
- `.dockerignore` est configuré pour ne pas exclure `pkg` afin que les bindings WASM soient disponibles au runtime.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
9
docs/release-notes-0.1.1.md
Normal file
9
docs/release-notes-0.1.1.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Release Notes 0.1.1
|
||||||
|
|
||||||
|
Date: 2025-08-26
|
||||||
|
|
||||||
|
- Bump version à 0.1.1
|
||||||
|
- Docs déploiement actualisées (tags)
|
||||||
|
- Tests utilitaires additionnels
|
||||||
|
|
||||||
|
|
12
docs/template-alignment.md
Normal file
12
docs/template-alignment.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Alignement avec 4NK_project_template
|
||||||
|
|
||||||
|
Référence: [4NK_project_template](https://git.4nkweb.com/nicolas.cantu/4NK_project_template.git)
|
||||||
|
|
||||||
|
Modifications principales:
|
||||||
|
- Ajout fichiers OSS: `LICENSE` (MIT), `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `SECURITY.md`, `CHANGELOG.md`.
|
||||||
|
- Ajout fichiers/config: `.4nk-sync.yml`, `.gitea/`, `.cursor/`, `AGENTS.md`, `README.md`.
|
||||||
|
- Maintien des dossiers `docs/` et `tests/`; ajout `docs/docker-support.md`, `docs/REX.md` et `tests/config.test.ts`.
|
||||||
|
- Mise à jour `package.json` (license MIT), installation `vitest` et `@types/node`.
|
||||||
|
- Build et tests: OK (`npm run build`, `npm test`).
|
||||||
|
|
||||||
|
|
1717
package-lock.json
generated
1717
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
10
package.json
10
package.json
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "sdk_signer",
|
"name": "sdk_signer",
|
||||||
"version": "1.0.0",
|
"version": "0.1.1",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "vitest run",
|
||||||
"build_wasm": "wasm-pack build --out-dir ../sdk_signer/pkg ../sdk_client --target nodejs --dev",
|
"build_wasm": "wasm-pack build --out-dir ../sdk_signer/pkg ../sdk_client --target nodejs --dev",
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"start": "node dist/index.js",
|
"start": "node dist/index.js",
|
||||||
@ -12,10 +12,12 @@
|
|||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"typescript": "^5.3.3",
|
"typescript": "^5.3.3",
|
||||||
"ts-node": "^10.9.2"
|
"ts-node": "^10.9.2",
|
||||||
|
"vitest": "^1.6.0",
|
||||||
|
"@types/node": "^22.5.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ws": "^8.14.2",
|
"ws": "^8.14.2",
|
||||||
|
4
scripts/README.md
Normal file
4
scripts/README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# scripts
|
||||||
|
|
||||||
|
Scripts utilitaires pour CI/CD ou développement local.
|
||||||
|
|
21
scripts/checks/version_alignment.sh
Executable file
21
scripts/checks/version_alignment.sh
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/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"
|
||||||
|
|
145
scripts/deploy/setup.sh
Executable file
145
scripts/deploy/setup.sh
Executable file
@ -0,0 +1,145 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ENV_DIR="${HOME}/.4nk_template"
|
||||||
|
ENV_FILE="${ENV_DIR}/.env"
|
||||||
|
TEMPLATE_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||||
|
TEMPLATE_IN_REPO="${TEMPLATE_ROOT}/scripts/env/.env.template"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<USAGE
|
||||||
|
Usage: $0 <git_url> [--dest DIR] [--force]
|
||||||
|
|
||||||
|
Actions:
|
||||||
|
1) Provisionne ~/.4nk_template/.env (si absent)
|
||||||
|
2) Clone le dépôt cible si le dossier n'existe pas
|
||||||
|
3) Copie la structure normative 4NK_template dans le projet cible:
|
||||||
|
- .gitea/** (workflows, templates issues/PR)
|
||||||
|
- AGENTS.md
|
||||||
|
- .cursor/rules/** (si présent)
|
||||||
|
- scripts/agents/**, scripts/env/ensure_env.sh, scripts/deploy/setup.sh
|
||||||
|
- docs/templates/** et docs/INDEX.md (table des matières)
|
||||||
|
4) Ne remplace pas les fichiers existants sauf si --force
|
||||||
|
|
||||||
|
Exemples:
|
||||||
|
$0 https://git.example.com/org/projet.git
|
||||||
|
$0 git@host:org/projet.git --dest ~/work --force
|
||||||
|
USAGE
|
||||||
|
}
|
||||||
|
|
||||||
|
GIT_URL="${1:-}"
|
||||||
|
DEST_PARENT="$(pwd)"
|
||||||
|
FORCE_COPY=0
|
||||||
|
shift || true
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
--dest)
|
||||||
|
DEST_PARENT="${2:-}"; shift 2 ;;
|
||||||
|
--force)
|
||||||
|
FORCE_COPY=1; shift ;;
|
||||||
|
-h|--help)
|
||||||
|
usage; exit 0 ;;
|
||||||
|
*)
|
||||||
|
echo "Option inconnue: $1" >&2; usage; exit 2 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -z "${GIT_URL}" ]]; then
|
||||||
|
usage; exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "${ENV_DIR}"
|
||||||
|
chmod 700 "${ENV_DIR}" || true
|
||||||
|
|
||||||
|
if [[ ! -f "${ENV_FILE}" ]]; then
|
||||||
|
if [[ -f "${TEMPLATE_IN_REPO}" ]]; then
|
||||||
|
cp "${TEMPLATE_IN_REPO}" "${ENV_FILE}"
|
||||||
|
else
|
||||||
|
cat >"${ENV_FILE}" <<'EOF'
|
||||||
|
# Fichier d'exemple d'environnement pour 4NK_template
|
||||||
|
# Copiez ce fichier vers ~/.4nk_template/.env puis complétez les valeurs.
|
||||||
|
# Ne committez jamais de fichier contenant des secrets.
|
||||||
|
|
||||||
|
# OpenAI (agents IA)
|
||||||
|
OPENAI_API_KEY=
|
||||||
|
OPENAI_MODEL=
|
||||||
|
OPENAI_API_BASE=https://api.openai.com/v1
|
||||||
|
OPENAI_TEMPERATURE=0.2
|
||||||
|
|
||||||
|
# Gitea (release via API)
|
||||||
|
BASE_URL=https://git.4nkweb.com
|
||||||
|
RELEASE_TOKEN=
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
chmod 600 "${ENV_FILE}" || true
|
||||||
|
echo "Fichier créé: ${ENV_FILE}. Complétez les valeurs requises (ex: OPENAI_API_KEY, OPENAI_MODEL, RELEASE_TOKEN)." >&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2) Clonage du dépôt si nécessaire
|
||||||
|
repo_name="$(basename -s .git "${GIT_URL}")"
|
||||||
|
target_dir="${DEST_PARENT%/}/${repo_name}"
|
||||||
|
if [[ ! -d "${target_dir}" ]]; then
|
||||||
|
echo "Clonage: ${GIT_URL} → ${target_dir}" >&2
|
||||||
|
git clone --depth 1 "${GIT_URL}" "${target_dir}"
|
||||||
|
else
|
||||||
|
echo "Dossier existant, pas de clone: ${target_dir}" >&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
copy_item() {
|
||||||
|
local src="$1" dst="$2"
|
||||||
|
if [[ ! -e "$src" ]]; then return 0; fi
|
||||||
|
if [[ -d "$src" ]]; then
|
||||||
|
mkdir -p "$dst"
|
||||||
|
if (( FORCE_COPY )); then
|
||||||
|
cp -a "$src/." "$dst/"
|
||||||
|
else
|
||||||
|
(cd "$src" && find . -type f -print0) | while IFS= read -r -d '' f; do
|
||||||
|
if [[ ! -e "$dst/$f" ]]; then
|
||||||
|
mkdir -p "$(dirname "$dst/$f")"
|
||||||
|
cp -a "$src/$f" "$dst/$f"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ -e "$dst" && $FORCE_COPY -eq 0 ]]; then return 0; fi
|
||||||
|
mkdir -p "$(dirname "$dst")" && cp -a "$src" "$dst"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 3) Copie de la structure normative
|
||||||
|
copy_item "${TEMPLATE_ROOT}/.gitea" "${target_dir}/.gitea"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/AGENTS.md" "${target_dir}/AGENTS.md"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/.cursor" "${target_dir}/.cursor"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/.cursorignore" "${target_dir}/.cursorignore"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/.gitignore" "${target_dir}/.gitignore"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/.markdownlint.json" "${target_dir}/.markdownlint.json"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/LICENSE" "${target_dir}/LICENSE"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/CONTRIBUTING.md" "${target_dir}/CONTRIBUTING.md"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/CODE_OF_CONDUCT.md" "${target_dir}/CODE_OF_CONDUCT.md"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/SECURITY.md" "${target_dir}/SECURITY.md"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/TEMPLATE_VERSION" "${target_dir}/TEMPLATE_VERSION"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/security" "${target_dir}/security"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/scripts" "${target_dir}/scripts"
|
||||||
|
copy_item "${TEMPLATE_ROOT}/docs/templates" "${target_dir}/docs/templates"
|
||||||
|
|
||||||
|
# Génération docs/INDEX.md dans le projet cible (si absent ou --force)
|
||||||
|
INDEX_DST="${target_dir}/docs/INDEX.md"
|
||||||
|
if [[ ! -f "${INDEX_DST}" || $FORCE_COPY -eq 1 ]]; then
|
||||||
|
mkdir -p "$(dirname "${INDEX_DST}")"
|
||||||
|
cat >"${INDEX_DST}" <<'IDX'
|
||||||
|
# Documentation du projet
|
||||||
|
|
||||||
|
Cette table des matières oriente vers:
|
||||||
|
- Documentation spécifique au projet: `docs/project/`
|
||||||
|
- Modèles génériques à adapter: `docs/templates/`
|
||||||
|
|
||||||
|
## Sommaire
|
||||||
|
- À personnaliser: `docs/project/README.md`, `docs/project/INDEX.md`, `docs/project/ARCHITECTURE.md`, `docs/project/USAGE.md`, etc.
|
||||||
|
|
||||||
|
## Modèles génériques
|
||||||
|
- Voir: `docs/templates/`
|
||||||
|
IDX
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Template 4NK appliqué à: ${target_dir}" >&2
|
||||||
|
exit 0
|
15
scripts/dev/run_container.sh
Executable file
15
scripts/dev/run_container.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
IMAGE_NAME="4nk-template-dev:debian"
|
||||||
|
DOCKERFILE="docker/Dockerfile.debian"
|
||||||
|
|
||||||
|
echo "[build] ${IMAGE_NAME}"
|
||||||
|
docker build -t "${IMAGE_NAME}" -f "${DOCKERFILE}" .
|
||||||
|
|
||||||
|
echo "[run] launching container and executing agents"
|
||||||
|
docker run --rm -it \
|
||||||
|
-v "${PWD}:/work" -w /work \
|
||||||
|
"${IMAGE_NAME}" \
|
||||||
|
"scripts/agents/run.sh; ls -la tests/reports/agents || true"
|
||||||
|
|
14
scripts/dev/run_project_ci.sh
Executable file
14
scripts/dev/run_project_ci.sh
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Build et lance le conteneur unifié (runner+agents) sur ce projet
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||||
|
cd "$ROOT_DIR"
|
||||||
|
|
||||||
|
# Build image
|
||||||
|
docker compose -f docker-compose.ci.yml build
|
||||||
|
|
||||||
|
# Exécuter agents par défaut
|
||||||
|
RUNNER_MODE="${RUNNER_MODE:-agents}" BASE_URL="${BASE_URL:-}" REGISTRATION_TOKEN="${REGISTRATION_TOKEN:-}" \
|
||||||
|
docker compose -f docker-compose.ci.yml up --remove-orphans --abort-on-container-exit
|
42
scripts/env/ensure_env.sh
vendored
Executable file
42
scripts/env/ensure_env.sh
vendored
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||||
|
TEMPLATE_FILE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/.env.template"
|
||||||
|
ENV_DIR="${HOME}/.4nk_template"
|
||||||
|
ENV_FILE="${ENV_DIR}/.env"
|
||||||
|
|
||||||
|
mkdir -p "${ENV_DIR}"
|
||||||
|
chmod 700 "${ENV_DIR}" || true
|
||||||
|
|
||||||
|
if [[ ! -f "${ENV_FILE}" ]]; then
|
||||||
|
if [[ -f "${TEMPLATE_FILE}" ]]; then
|
||||||
|
cp "${TEMPLATE_FILE}" "${ENV_FILE}"
|
||||||
|
chmod 600 "${ENV_FILE}" || true
|
||||||
|
echo "Fichier d'environnement créé: ${ENV_FILE}" >&2
|
||||||
|
echo "Veuillez renseigner les variables requises (OPENAI_API_KEY, OPENAI_MODEL, etc.)." >&2
|
||||||
|
exit 3
|
||||||
|
else
|
||||||
|
echo "Modèle d'environnement introuvable: ${TEMPLATE_FILE}" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Charger pour validation
|
||||||
|
set -a
|
||||||
|
. "${ENV_FILE}"
|
||||||
|
set +a
|
||||||
|
|
||||||
|
MISSING=()
|
||||||
|
for var in OPENAI_API_KEY OPENAI_MODEL; do
|
||||||
|
if [[ -z "${!var:-}" ]]; then
|
||||||
|
MISSING+=("$var")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if (( ${#MISSING[@]} > 0 )); then
|
||||||
|
echo "Variables manquantes dans ${ENV_FILE}: ${MISSING[*]}" >&2
|
||||||
|
exit 4
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Environnement valide: ${ENV_FILE}" >&2
|
19
scripts/local/install_hooks.sh
Executable file
19
scripts/local/install_hooks.sh
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"/..
|
||||||
|
HOOKS_DIR="$REPO_ROOT/.git/hooks"
|
||||||
|
|
||||||
|
mkdir -p "$HOOKS_DIR"
|
||||||
|
install_hook() {
|
||||||
|
local name="$1" src="$2"
|
||||||
|
cp -f "$src" "$HOOKS_DIR/$name"
|
||||||
|
chmod +x "$HOOKS_DIR/$name"
|
||||||
|
echo "Installed hook: $name"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Hooks qui délèguent aux agents via l'image Docker du template sur le projet courant
|
||||||
|
install_hook pre-commit "$REPO_ROOT/scripts/local/precommit.sh"
|
||||||
|
install_hook pre-push "$REPO_ROOT/scripts/local/prepush.sh"
|
||||||
|
|
||||||
|
echo "Hooks installés (mode agents via 4NK_template)."
|
25
scripts/local/merge_branch.sh
Executable file
25
scripts/local/merge_branch.sh
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
TARGET_BRANCH="${1:-main}"
|
||||||
|
SOURCE_BRANCH="${2:-}"
|
||||||
|
|
||||||
|
if [[ -z "$SOURCE_BRANCH" ]]; then
|
||||||
|
SOURCE_BRANCH="$(git rev-parse --abbrev-ref HEAD)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$SOURCE_BRANCH" == "$TARGET_BRANCH" ]]; then
|
||||||
|
echo "Déjà sur $TARGET_BRANCH"; exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Valider localement avant merge
|
||||||
|
AUTO_FIX="${AUTO_FIX:-1}" SCOPE="${SCOPE:-all}" scripts/agents/run.sh || true
|
||||||
|
if [ -f scripts/security/audit.sh ]; then bash scripts/security/audit.sh || true; fi
|
||||||
|
|
||||||
|
git fetch origin --prune
|
||||||
|
git checkout "$TARGET_BRANCH"
|
||||||
|
git pull --ff-only origin "$TARGET_BRANCH" || true
|
||||||
|
git merge --no-ff "$SOURCE_BRANCH" -m "[skip ci] merge: $SOURCE_BRANCH -> $TARGET_BRANCH"
|
||||||
|
git push origin "$TARGET_BRANCH"
|
||||||
|
|
||||||
|
echo "Merge effectué: $SOURCE_BRANCH → $TARGET_BRANCH"
|
11
scripts/local/precommit.sh
Executable file
11
scripts/local/precommit.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Exécuter les agents depuis l'image Docker de 4NK_template sur le projet courant
|
||||||
|
PROJECT_DIR="$(git rev-parse --show-toplevel)"
|
||||||
|
TEMPLATE_DIR="$(cd "${PROJECT_DIR}/../4NK_template" && pwd)"
|
||||||
|
|
||||||
|
mkdir -p "${PROJECT_DIR}/tests/reports/agents"
|
||||||
|
"${TEMPLATE_DIR}/scripts/local/run_agents_for_project.sh" "${PROJECT_DIR}" "tests/reports/agents"
|
||||||
|
|
||||||
|
echo "[pre-commit] OK (agents via 4NK_template)"
|
21
scripts/local/prepush.sh
Executable file
21
scripts/local/prepush.sh
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Exécuter les agents depuis l'image Docker de 4NK_template sur le projet courant
|
||||||
|
PROJECT_DIR="$(git rev-parse --show-toplevel)"
|
||||||
|
TEMPLATE_DIR="$(cd "${PROJECT_DIR}/../4NK_template" && pwd)"
|
||||||
|
|
||||||
|
mkdir -p "${PROJECT_DIR}/tests/reports/agents"
|
||||||
|
"${TEMPLATE_DIR}/scripts/local/run_agents_for_project.sh" "${PROJECT_DIR}" "tests/reports/agents"
|
||||||
|
|
||||||
|
# Audit sécurité (best effort) dans le contexte du projet
|
||||||
|
if [ -f "${PROJECT_DIR}/scripts/security/audit.sh" ]; then
|
||||||
|
(cd "${PROJECT_DIR}" && bash scripts/security/audit.sh) || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Release guard (dry-run logique) dans le contexte du projet
|
||||||
|
if [ -f "${PROJECT_DIR}/scripts/release/guard.sh" ]; then
|
||||||
|
(cd "${PROJECT_DIR}" && bash scripts/release/guard.sh) || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[pre-push] OK (agents via 4NK_template)"
|
20
scripts/local/release_local.sh
Executable file
20
scripts/local/release_local.sh
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
VERSION="${1:-}"
|
||||||
|
if [[ -z "$VERSION" ]]; then
|
||||||
|
echo "Usage: $0 vYYYY.MM.P" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
cd "$ROOT_DIR/.."
|
||||||
|
|
||||||
|
echo "$VERSION" > TEMPLATE_VERSION
|
||||||
|
git add TEMPLATE_VERSION CHANGELOG.md 2>/dev/null || true
|
||||||
|
git commit -m "[skip ci] chore(release): $VERSION" || true
|
||||||
|
git tag -a "$VERSION" -m "release: $VERSION (latest)"
|
||||||
|
git push || true
|
||||||
|
git push origin "$VERSION"
|
||||||
|
|
||||||
|
echo "Release locale préparée: $VERSION"
|
51
scripts/local/run_agents_for_project.sh
Executable file
51
scripts/local/run_agents_for_project.sh
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Script pour lancer les agents de 4NK_template sur un projet externe
|
||||||
|
# Usage: ./run_agents_for_project.sh [project_path] [output_dir]
|
||||||
|
|
||||||
|
PROJECT_PATH="${1:-.}"
|
||||||
|
OUTPUT_DIR="${2:-tests/reports/agents}"
|
||||||
|
TEMPLATE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||||
|
MODULE_LAST_IMAGE_FILE="$(cd "$TEMPLATE_DIR/.." && pwd)/modules/4NK_template/.last_image"
|
||||||
|
|
||||||
|
if [[ ! -d "$PROJECT_PATH" ]]; then
|
||||||
|
echo "Erreur: Le projet '$PROJECT_PATH' n'existe pas" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$PROJECT_PATH/$OUTPUT_DIR"
|
||||||
|
|
||||||
|
echo "=== Lancement des agents 4NK_template sur: $PROJECT_PATH ==="
|
||||||
|
|
||||||
|
if ! command -v docker >/dev/null 2>&1; then
|
||||||
|
echo "Docker requis pour exécuter les agents via conteneur." >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Si une image du module existe, l'utiliser en priorité
|
||||||
|
if [[ -f "$MODULE_LAST_IMAGE_FILE" ]]; then
|
||||||
|
IMAGE_NAME="$(cat "$MODULE_LAST_IMAGE_FILE" | tr -d '\r\n')"
|
||||||
|
echo "Utilisation de l'image du module: $IMAGE_NAME"
|
||||||
|
# Préparer montage du fichier d'env si présent
|
||||||
|
ENV_MOUNT=""
|
||||||
|
if [[ -f "$HOME/.4nk_template/.env" ]]; then
|
||||||
|
ENV_MOUNT="-v $HOME/.4nk_template/.env:/root/.4nk_template/.env:ro"
|
||||||
|
fi
|
||||||
|
# Lancer le conteneur en utilisant l'ENTRYPOINT qui configure safe.directory
|
||||||
|
docker run --rm \
|
||||||
|
-e RUNNER_MODE=agents \
|
||||||
|
-e TARGET_DIR=/work \
|
||||||
|
-e OUTPUT_DIR=/work/$OUTPUT_DIR \
|
||||||
|
-v "$(realpath "$PROJECT_PATH"):/work" \
|
||||||
|
$ENV_MOUNT \
|
||||||
|
"$IMAGE_NAME" || true
|
||||||
|
else
|
||||||
|
echo "Aucune image de module détectée, fallback docker compose dans 4NK_template"
|
||||||
|
cd "$TEMPLATE_DIR"
|
||||||
|
docker compose -f docker-compose.ci.yml build
|
||||||
|
RUNNER_MODE="agents" TARGET_DIR="/work" OUTPUT_DIR="/work/$OUTPUT_DIR" \
|
||||||
|
docker compose -f docker-compose.ci.yml run --rm project-ci || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Agents terminés → $PROJECT_PATH/$OUTPUT_DIR ==="
|
66
scripts/release/guard.sh
Executable file
66
scripts/release/guard.sh
Executable file
@ -0,0 +1,66 @@
|
|||||||
|
#!/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"
|
||||||
|
|
166
scripts/scripts/auto-ssh-push.sh
Executable file
166
scripts/scripts/auto-ssh-push.sh
Executable file
@ -0,0 +1,166 @@
|
|||||||
|
#!/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
|
||||||
|
get_current_branch() {
|
||||||
|
# Détecte la branche courante, compatible anciennes versions de git
|
||||||
|
local br
|
||||||
|
br="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)"
|
||||||
|
if [ -z "$br" ] || [ "$br" = "HEAD" ]; then
|
||||||
|
br="$(git symbolic-ref --short -q HEAD 2>/dev/null || true)"
|
||||||
|
fi
|
||||||
|
if [ -z "$br" ]; then
|
||||||
|
# dernier recours: parser la sortie de "git branch"
|
||||||
|
br="$(git branch 2>/dev/null | sed -n 's/^* //p' | head -n1)"
|
||||||
|
fi
|
||||||
|
echo "$br"
|
||||||
|
}
|
||||||
|
|
||||||
|
auto_push() {
|
||||||
|
local branch
|
||||||
|
branch=${1:-$(get_current_branch)}
|
||||||
|
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 à commite
|
||||||
|
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:-$(get_current_branch)}
|
||||||
|
|
||||||
|
echo "💬 Push avec message: $message"
|
||||||
|
auto_push "$branch" "$message"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction pour push rapide (sans message)
|
||||||
|
quick_push() {
|
||||||
|
local branch=${1:-$(get_current_branch)}
|
||||||
|
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:-$(get_current_branch)}
|
||||||
|
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é !"
|
60
scripts/scripts/init-ssh-env.sh
Executable file
60
scripts/scripts/init-ssh-env.sh
Executable file
@ -0,0 +1,60 @@
|
|||||||
|
#!/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 ==="
|
||||||
|
|
55
scripts/scripts/setup-ssh-ci.sh
Executable file
55
scripts/scripts/setup-ssh-ci.sh
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
#!/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"
|
||||||
|
|
35
scripts/security/audit.sh
Executable file
35
scripts/security/audit.sh
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo "[security-audit] démarrage"
|
||||||
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd)"
|
||||||
|
cd "$ROOT_DIR"
|
||||||
|
|
||||||
|
rc=0
|
||||||
|
|
||||||
|
# 1) Audit npm (si package.json présent)
|
||||||
|
if [ -f package.json ]; then
|
||||||
|
echo "[security-audit] npm audit --audit-level=moderate"
|
||||||
|
if ! npm audit --audit-level=moderate; then rc=1; fi || true
|
||||||
|
else
|
||||||
|
echo "[security-audit] pas de package.json (ok)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2) Audit Rust (si Cargo.toml présent)
|
||||||
|
if command -v cargo >/dev/null 2>&1 && [ -f Cargo.toml ] || find . -maxdepth 2 -name Cargo.toml | grep -q . ; then
|
||||||
|
echo "[security-audit] cargo audit"
|
||||||
|
if ! cargo audit --deny warnings; then rc=1; fi || true
|
||||||
|
else
|
||||||
|
echo "[security-audit] pas de projet Rust (ok)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3) Recherche de secrets grossiers
|
||||||
|
echo "[security-audit] scan secrets"
|
||||||
|
if grep -RIE "(?i)(api[_-]?key|secret|password|private[_-]?key)" --exclude-dir .git --exclude-dir node_modules --exclude-dir target --exclude "*.md" . >/dev/null 2>&1; then
|
||||||
|
echo "[security-audit] secrets potentiels détectés"; rc=1
|
||||||
|
else
|
||||||
|
echo "[security-audit] aucun secret évident"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[security-audit] terminé rc=$rc"
|
||||||
|
exit $rc
|
47
scripts/utils/check_md024.ps1
Normal file
47
scripts/utils/check_md024.ps1
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
Param(
|
||||||
|
[string]$Root = "."
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
|
||||||
|
$files = Get-ChildItem -Path $Root -Recurse -Filter *.md | Where-Object { $_.FullName -notmatch '\\archive\\' }
|
||||||
|
$had = $false
|
||||||
|
foreach ($f in $files) {
|
||||||
|
try {
|
||||||
|
$lines = Get-Content -LiteralPath $f.FullName -Encoding UTF8 -ErrorAction Stop
|
||||||
|
} catch {
|
||||||
|
Write-Warning ("Impossible de lire: {0} — {1}" -f $f.FullName, $_.Exception.Message)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
$map = @{}
|
||||||
|
$firstMap = @{}
|
||||||
|
$dups = @{}
|
||||||
|
for ($i = 0; $i -lt $lines.Count; $i++) {
|
||||||
|
$line = $lines[$i]
|
||||||
|
if ($line -match '^\s{0,3}#{1,6}\s+(.*)$') {
|
||||||
|
$t = $Matches[1].Trim()
|
||||||
|
$norm = ([regex]::Replace($t, '\s+', ' ')).ToLowerInvariant()
|
||||||
|
if ($map.ContainsKey($norm)) {
|
||||||
|
if (-not $dups.ContainsKey($norm)) {
|
||||||
|
$dups[$norm] = New-Object System.Collections.ArrayList
|
||||||
|
$firstMap[$norm] = $map[$norm]
|
||||||
|
}
|
||||||
|
[void]$dups[$norm].Add($i + 1)
|
||||||
|
} else {
|
||||||
|
$map[$norm] = $i + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($dups.Keys.Count -gt 0) {
|
||||||
|
$had = $true
|
||||||
|
Write-Output "=== $($f.FullName) ==="
|
||||||
|
foreach ($k in $dups.Keys) {
|
||||||
|
$first = $firstMap[$k]
|
||||||
|
$others = ($dups[$k] -join ', ')
|
||||||
|
Write-Output ("Heading: '{0}' first@{1} duplicates@[{2}]" -f $k, $first, $others)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (-not $had) {
|
||||||
|
Write-Output "No duplicate headings detected."
|
||||||
|
}
|
@ -3,15 +3,29 @@ import dotenv from 'dotenv';
|
|||||||
// Load environment variables from .env file
|
// Load environment variables from .env file
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
|
|
||||||
export const config = {
|
export interface AppConfig {
|
||||||
port: parseInt(process.env.PORT || '9090'),
|
port: number;
|
||||||
apiKey: process.env.API_KEY || 'your-api-key-change-this',
|
apiKey: string;
|
||||||
databasePath: process.env.DATABASE_PATH || './data/server.db',
|
databasePath: string;
|
||||||
relayUrls: process.env.RELAY_URLS?.split(',') || ['ws://localhost:8090'],
|
relayUrls: string[];
|
||||||
autoRestart: process.env.AUTO_RESTART === 'true',
|
autoRestart: boolean;
|
||||||
maxRestarts: parseInt(process.env.MAX_RESTARTS || '10'),
|
maxRestarts: number;
|
||||||
logLevel: process.env.LOG_LEVEL || 'info'
|
logLevel: string;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
export function loadConfig(): AppConfig {
|
||||||
|
return {
|
||||||
|
port: parseInt(process.env.PORT || '9090'),
|
||||||
|
apiKey: process.env.API_KEY || 'your-api-key-change-this',
|
||||||
|
databasePath: process.env.DATABASE_PATH || './data/server.db',
|
||||||
|
relayUrls: process.env.RELAY_URLS?.split(',') || ['ws://localhost:8090'],
|
||||||
|
autoRestart: process.env.AUTO_RESTART === 'true',
|
||||||
|
maxRestarts: parseInt(process.env.MAX_RESTARTS || '10'),
|
||||||
|
logLevel: process.env.LOG_LEVEL || 'info'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export const config: AppConfig = loadConfig();
|
||||||
|
|
||||||
// Validate required environment variables
|
// Validate required environment variables
|
||||||
if (!config.apiKey || config.apiKey === 'your-api-key-change-this') {
|
if (!config.apiKey || config.apiKey === 'your-api-key-change-this') {
|
||||||
|
@ -40,7 +40,7 @@ export enum MessageType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Re-export AnkFlag from WASM for relay message typing
|
// Re-export AnkFlag from WASM for relay message typing
|
||||||
export { AnkFlag } from '../pkg/sdk_client';
|
export type { AnkFlag } from '../pkg/sdk_client';
|
||||||
|
|
||||||
// Message priority levels
|
// Message priority levels
|
||||||
export enum MessagePriority {
|
export enum MessagePriority {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import WebSocket from 'ws';
|
import WebSocket from 'ws';
|
||||||
import { AnkFlag } from '../pkg/sdk_client';
|
import type { AnkFlag } from '../pkg/sdk_client';
|
||||||
import { Service } from './service';
|
import { Service } from './service';
|
||||||
|
|
||||||
interface RelayConnection {
|
interface RelayConnection {
|
||||||
|
@ -11,7 +11,7 @@ const DEVICE_KEY = 'main_device';
|
|||||||
|
|
||||||
export class Service {
|
export class Service {
|
||||||
private static instance: Service;
|
private static instance: Service;
|
||||||
private processes: Map<string, Process> = new Map();
|
private processes: Map<string, any> = new Map();
|
||||||
private membersList: any = {};
|
private membersList: any = {};
|
||||||
private relayManager: RelayManager;
|
private relayManager: RelayManager;
|
||||||
private storages: string[] = []; // storage urls
|
private storages: string[] = []; // storage urls
|
||||||
@ -103,7 +103,7 @@ export class Service {
|
|||||||
if (lastCommitedState && lastCommitedState.public_data && lastCommitedState.public_data['pairedAddresses']) {
|
if (lastCommitedState && lastCommitedState.public_data && lastCommitedState.public_data['pairedAddresses']) {
|
||||||
// This is a pairing process
|
// This is a pairing process
|
||||||
try {
|
try {
|
||||||
const pairedAddresses = this.decodeValue(lastCommitedState.public_data['pairedAddresses']);
|
const pairedAddresses = this.decodeValue(lastCommitedState.public_data['pairedAddresses'] as unknown as number[]);
|
||||||
// Are we part of it?
|
// Are we part of it?
|
||||||
if (pairedAddresses && pairedAddresses.length > 0 && pairedAddresses.includes(this.getDeviceAddress())) {
|
if (pairedAddresses && pairedAddresses.length > 0 && pairedAddresses.includes(this.getDeviceAddress())) {
|
||||||
// We save the process to db
|
// We save the process to db
|
||||||
@ -652,7 +652,7 @@ export class Service {
|
|||||||
|
|
||||||
if (result.updated_process) {
|
if (result.updated_process) {
|
||||||
// Update our cache
|
// Update our cache
|
||||||
this.processes.set(process.states[0]?.state_id || 'unknown', result.updated_process.current_process);
|
this.processes.set(result.updated_process.process_id, result.updated_process.current_process);
|
||||||
|
|
||||||
// Save to database
|
// Save to database
|
||||||
await this.saveProcessToDb(result.updated_process.process_id, result.updated_process.current_process);
|
await this.saveProcessToDb(result.updated_process.process_id, result.updated_process.current_process);
|
||||||
@ -797,7 +797,7 @@ export class Service {
|
|||||||
|
|
||||||
// Update in-memory cache with all processes
|
// Update in-memory cache with all processes
|
||||||
for (const [processId, process] of Object.entries(processes)) {
|
for (const [processId, process] of Object.entries(processes)) {
|
||||||
this.processes.set(processId, process);
|
this.processes.set(processId, process as any);
|
||||||
}
|
}
|
||||||
|
|
||||||
return processes;
|
return processes;
|
||||||
@ -918,7 +918,7 @@ export class Service {
|
|||||||
if (process.states.length === 0) return null;
|
if (process.states.length === 0) return null;
|
||||||
const processTip = process.states[process.states.length - 1].commited_in;
|
const processTip = process.states[process.states.length - 1].commited_in;
|
||||||
for (let i = process.states.length - 1; i >= 0; i--) {
|
for (let i = process.states.length - 1; i >= 0; i--) {
|
||||||
if (process.states[i].commited_in !== processTip) {
|
if ((process.states[i] as any).commited_in !== processTip) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -361,8 +361,8 @@ export class Server {
|
|||||||
console.log('🔑 Not paired, creating pairing process...');
|
console.log('🔑 Not paired, creating pairing process...');
|
||||||
try {
|
try {
|
||||||
const pairingResult = await service.createPairingProcess('', []);
|
const pairingResult = await service.createPairingProcess('', []);
|
||||||
const processId: string = pairingResult.updated_process?.process_id;
|
const processId = pairingResult.updated_process?.process_id as string;
|
||||||
const stateId = pairingResult.updated_process?.current_process?.states[0].state_id;
|
const stateId = pairingResult.updated_process?.current_process?.states[0]?.state_id as string;
|
||||||
if (!processId || !stateId) {
|
if (!processId || !stateId) {
|
||||||
throw new Error('Failed to get process id or state id');
|
throw new Error('Failed to get process id or state id');
|
||||||
}
|
}
|
||||||
|
37
src/types/pkg__sdk_client.d.ts
vendored
Normal file
37
src/types/pkg__sdk_client.d.ts
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// Déclarations minimales pour le module WASM '../pkg/sdk_client'
|
||||||
|
// Ajuster si le package expose d'autres types/méthodes.
|
||||||
|
|
||||||
|
declare module '../pkg/sdk_client' {
|
||||||
|
export interface ProcessState {
|
||||||
|
state_id: string;
|
||||||
|
keys: Record<string, string>;
|
||||||
|
pcd_commitment: Record<string, string>;
|
||||||
|
public_data: Record<string, string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Process {
|
||||||
|
process_id: string;
|
||||||
|
current_process: {
|
||||||
|
states: ProcessState[];
|
||||||
|
};
|
||||||
|
states: ProcessState[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ApiReturn {
|
||||||
|
updated_process?: Process;
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum AnkFlag {}
|
||||||
|
|
||||||
|
export interface Device {}
|
||||||
|
export interface HandshakeMessage {}
|
||||||
|
export interface Member {}
|
||||||
|
export interface MerkleProofResult {}
|
||||||
|
export interface OutPointProcessMap {}
|
||||||
|
export interface RoleDefinition {}
|
||||||
|
export interface SecretsStore {}
|
||||||
|
export interface UserDiff {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
59
tests/config.test.ts
Normal file
59
tests/config.test.ts
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import { describe, it, expect, beforeEach } from 'vitest';
|
||||||
|
|
||||||
|
// Helper pour recharger le module avec de nouvelles variables d'env
|
||||||
|
async function loadConfig() {
|
||||||
|
const modulePath = '../src/config';
|
||||||
|
// Vitest supporte l'invalidation via import dynamique après resetModules
|
||||||
|
const mod = await import(modulePath);
|
||||||
|
return (mod.loadConfig as typeof import('../src/config').loadConfig)();
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('config', () => {
|
||||||
|
const envBackup = { ...process.env };
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
process.env = { ...envBackup };
|
||||||
|
delete process.env.PORT;
|
||||||
|
delete process.env.API_KEY;
|
||||||
|
delete process.env.DATABASE_PATH;
|
||||||
|
delete process.env.RELAY_URLS;
|
||||||
|
delete process.env.AUTO_RESTART;
|
||||||
|
delete process.env.MAX_RESTARTS;
|
||||||
|
delete process.env.LOG_LEVEL;
|
||||||
|
// @ts-ignore: vitest injecte resetModules via globalThis
|
||||||
|
if (typeof vi !== 'undefined') vi.resetModules();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('charge les valeurs par défaut', async () => {
|
||||||
|
const cfg = await loadConfig();
|
||||||
|
expect(cfg.port).toBe(9090);
|
||||||
|
expect(cfg.apiKey).toBe('your-api-key-change-this');
|
||||||
|
expect(cfg.databasePath).toBe('./data/server.db');
|
||||||
|
expect(cfg.relayUrls).toEqual(['ws://localhost:8090']);
|
||||||
|
expect(cfg.autoRestart).toBe(false);
|
||||||
|
expect(cfg.maxRestarts).toBe(10);
|
||||||
|
expect(cfg.logLevel).toBe('info');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('lit les variables d’environnement', async () => {
|
||||||
|
process.env.PORT = '1234';
|
||||||
|
process.env.API_KEY = 'k';
|
||||||
|
process.env.DATABASE_PATH = '/x.db';
|
||||||
|
process.env.RELAY_URLS = 'ws://a:1,ws://b:2';
|
||||||
|
process.env.AUTO_RESTART = 'true';
|
||||||
|
process.env.MAX_RESTARTS = '7';
|
||||||
|
process.env.LOG_LEVEL = 'debug';
|
||||||
|
// @ts-ignore
|
||||||
|
if (typeof vi !== 'undefined') vi.resetModules();
|
||||||
|
const cfg = await loadConfig();
|
||||||
|
expect(cfg.port).toBe(1234);
|
||||||
|
expect(cfg.apiKey).toBe('k');
|
||||||
|
expect(cfg.databasePath).toBe('/x.db');
|
||||||
|
expect(cfg.relayUrls).toEqual(['ws://a:1', 'ws://b:2']);
|
||||||
|
expect(cfg.autoRestart).toBe(true);
|
||||||
|
expect(cfg.maxRestarts).toBe(7);
|
||||||
|
expect(cfg.logLevel).toBe('debug');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
21
tests/utils.test.ts
Normal file
21
tests/utils.test.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { describe, it, expect } from 'vitest';
|
||||||
|
import { isValid32ByteHex, EMPTY32BYTES } from '../src/utils';
|
||||||
|
|
||||||
|
describe('utils', () => {
|
||||||
|
it('valide un hex 32 octets', () => {
|
||||||
|
const ok = 'a'.repeat(64);
|
||||||
|
expect(isValid32ByteHex(ok)).toBe(true);
|
||||||
|
});
|
||||||
|
it('rejette une longueur incorrecte', () => {
|
||||||
|
const bad = 'a'.repeat(63);
|
||||||
|
expect(isValid32ByteHex(bad)).toBe(false);
|
||||||
|
});
|
||||||
|
it('rejette des caractères non-hex', () => {
|
||||||
|
const bad = 'g'.repeat(64);
|
||||||
|
expect(isValid32ByteHex(bad)).toBe(false);
|
||||||
|
});
|
||||||
|
it('EMPTY32BYTES a bien 64 caractères hex', () => {
|
||||||
|
expect(EMPTY32BYTES.length).toBe(64);
|
||||||
|
expect(isValid32ByteHex(EMPTY32BYTES)).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user