Compare commits
234 Commits
create-acc
...
docker-sup
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ddeda8490f | ||
![]() |
72d20c646e | ||
![]() |
a41328db28 | ||
![]() |
a7e9043ae4 | ||
![]() |
6db1c05576 | ||
![]() |
3cf817a4c0 | ||
![]() |
6e38410369 | ||
![]() |
7836eb0f8f | ||
![]() |
90d3c0c8ad | ||
![]() |
93d61c1e9c | ||
![]() |
2567e2f0da | ||
![]() |
300f88053e | ||
![]() |
c6a44757b4 | ||
![]() |
d35406b9e1 | ||
![]() |
74efff7cb2 | ||
![]() |
0eb6206675 | ||
![]() |
8a94c57c2a | ||
![]() |
288209a529 | ||
![]() |
8d4f6ed35e | ||
![]() |
775ca443f6 | ||
![]() |
b241e183ee | ||
![]() |
8f478db247 | ||
![]() |
9841c5a425 | ||
![]() |
62c4c9cb70 | ||
![]() |
857e6f019f | ||
![]() |
003597c222 | ||
![]() |
768ab840a5 | ||
![]() |
3a49f24cbc | ||
![]() |
47a256197a | ||
![]() |
647a3311eb | ||
![]() |
5791d960c4 | ||
![]() |
941bfb3b67 | ||
![]() |
38f8ec1d8f | ||
![]() |
08e4875087 | ||
![]() |
e72af33252 | ||
2844028993 | |||
197bdfd9b6 | |||
71b18a315f | |||
cb6826495a | |||
374c546cff | |||
ba27a59eea | |||
8c3dd51702 | |||
89c0bd8f4c | |||
39c010ace7 | |||
252398b52d | |||
48315fa755 | |||
4a5fdbed90 | |||
808c59c3df | |||
0be9f81b5e | |||
ea97ffa733 | |||
c563d7b16c | |||
484b5ea250 | |||
![]() |
19da967605 | ||
![]() |
d4223ce604 | ||
![]() |
420979e63e | ||
![]() |
1c92a40984 | ||
![]() |
046eef18e6 | ||
![]() |
2ba7be8dbb | ||
![]() |
77d9c1ad43 | ||
![]() |
3ce412d814 | ||
![]() |
7100eda272 | ||
![]() |
1a3a2dbef1 | ||
![]() |
76a1d38e09 | ||
![]() |
8a0a8e2df2 | ||
![]() |
48194dd2de | ||
![]() |
8e9d7f0c76 | ||
![]() |
eda7102ded | ||
ec99d101ab | |||
![]() |
0dd928d28b | ||
![]() |
5ba45a29be | ||
![]() |
8541427b87 | ||
7b86318dec | |||
![]() |
205796d22a | ||
b072495cea | |||
![]() |
9a601056b7 | ||
![]() |
d3e207c6da | ||
![]() |
cb5297e6fe | ||
![]() |
f0151fa55e | ||
![]() |
5192745a48 | ||
![]() |
a027004bd0 | ||
![]() |
aae11200d4 | ||
![]() |
dbb7f67154 | ||
![]() |
58fed7a53b | ||
![]() |
19b2ab994e | ||
![]() |
93d610e942 | ||
![]() |
1dad1d4e2b | ||
![]() |
5a98fac745 | ||
![]() |
18d46531a0 | ||
![]() |
62ccfec315 | ||
![]() |
e9fc0b8454 | ||
![]() |
5119d04243 | ||
![]() |
5a8c31df32 | ||
![]() |
deebcefc3d | ||
![]() |
d9b8817ecc | ||
![]() |
d8c2b22c3d | ||
![]() |
39f24114e1 | ||
![]() |
189bd3d252 | ||
![]() |
989263d44a | ||
![]() |
7391a08a01 | ||
![]() |
4e109e8fba | ||
![]() |
13b605a850 | ||
![]() |
0a860bd559 | ||
![]() |
a8b0248b5f | ||
![]() |
0dc3c83c3c | ||
![]() |
1a87a4db14 | ||
![]() |
67cd7a1662 | ||
![]() |
44f0d8c6c9 | ||
![]() |
10589b056f | ||
![]() |
926f41d270 | ||
![]() |
7c39795cef | ||
![]() |
207b308173 | ||
![]() |
337a6adc60 | ||
![]() |
d8422de94e | ||
![]() |
9edcc2e897 | ||
![]() |
f5fae245e2 | ||
ed4fa732f7 | |||
ac11893e93 | |||
929e7ee36d | |||
c2a4b598a7 | |||
2bd2fdff98 | |||
13731da7e1 | |||
![]() |
965f5da9a9 | ||
![]() |
18ef18db71 | ||
![]() |
50a92995d7 | ||
![]() |
17bdcec317 | ||
![]() |
25caed410e | ||
![]() |
cf57681c31 | ||
![]() |
91ba7205cc | ||
![]() |
d31e18d4ae | ||
![]() |
6076c342f8 | ||
![]() |
bb5d3ff16d | ||
![]() |
a3fe29e4a0 | ||
![]() |
0d51f9d056 | ||
![]() |
c0d402b234 | ||
![]() |
dfae77de58 | ||
![]() |
e1494d5bf4 | ||
![]() |
ed23adf8f1 | ||
![]() |
2a7c0d6675 | ||
![]() |
25dba4e67b | ||
![]() |
65d43686cb | ||
![]() |
18e82de549 | ||
f4d8f8652f | |||
39f2b086b5 | |||
00bc3d8ad2 | |||
b52ff937f0 | |||
d6e06f3594 | |||
05f13224fa | |||
06295fe591 | |||
72d43210de | |||
73cee5d144 | |||
85fe8cc251 | |||
ec9fe0f62c | |||
b6a2a5fc3b | |||
7417aec7e0 | |||
f42aca7eb9 | |||
0f0b5d1af3 | |||
84aa6298e3 | |||
14b539595f | |||
99400a71f7 | |||
c5b58d999f | |||
23a3b2a9e8 | |||
6167d59501 | |||
b828e5197a | |||
26ba3e6e93 | |||
df726d929a | |||
0e44a01218 | |||
8260c6c5da | |||
8eb6f36b64 | |||
e15da5c22a | |||
a8b3631dc1 | |||
89e9b3e4e0 | |||
c4db22f626 | |||
accd427cab | |||
381dcdf7a8 | |||
0cbc07cf63 | |||
3c59105aa6 | |||
325d2cbf13 | |||
d4f1f36376 | |||
f6edadc535 | |||
0099a8c858 | |||
0e0c3946d2 | |||
0a2a2674f8 | |||
9d461d63d7 | |||
2f68c652dd | |||
147f4cfa7d | |||
235aecd6a7 | |||
e1f2483924 | |||
0c2df347ec | |||
abfe581f29 | |||
b66ee42ddd | |||
aecdcd93e1 | |||
c63e2a6fe9 | |||
67963bfb02 | |||
4b12b560e1 | |||
28c151254c | |||
5d0c617bbb | |||
ae88959496 | |||
e5a958b0b9 | |||
6b77ec2972 | |||
a1ce472cad | |||
db48386f05 | |||
39b50d6789 | |||
86393e6cfa | |||
bf06b6634a | |||
cfc9514656 | |||
0f364c7c6e | |||
ee7c79a7d5 | |||
37bdb3dad3 | |||
ecba13594b | |||
4c534973d2 | |||
eca4d4de85 | |||
824a0b88f6 | |||
e224921f86 | |||
cf18e46e17 | |||
e6cf1c3658 | |||
b9851c587e | |||
d601d94bf6 | |||
d19ba72b4a | |||
2d0e15533a | |||
94ee8842e3 | |||
7b7d13ce6c | |||
cc9396c4b8 | |||
51c906866e | |||
3f42cb27a7 | |||
2601418aaf | |||
455fe53fe2 | |||
2f847514f0 | |||
a0888f8c90 | |||
f2e2aeaa9a | |||
2855365851 | |||
bb277706fd | |||
05dddd9567 | |||
d54ce71f02 | |||
a42141246d |
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.*
|
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}
|
106
.cursorignore
Normal file
106
.cursorignore
Normal file
@ -0,0 +1,106 @@
|
||||
# Fichiers et répertoires à ignorer pour l’indexation Cursor
|
||||
|
||||
# Dépendances frontend / JS
|
||||
node_modules/
|
||||
**/node_modules/**
|
||||
|
||||
# Artefacts de build et caches courants
|
||||
dist/
|
||||
build/
|
||||
out/
|
||||
.next/
|
||||
coverage/
|
||||
.cache/
|
||||
.turbo/
|
||||
.parcel-cache/
|
||||
.eslintcache
|
||||
|
||||
# Logs et temporaires
|
||||
*.log
|
||||
*.tmp
|
||||
*.swp
|
||||
*.swo
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Environnements et secrets (ne pas indexer)
|
||||
.env
|
||||
.env.*
|
||||
*.pem
|
||||
*.key
|
||||
*.crt
|
||||
|
||||
# Artefacts tests
|
||||
tests/logs/
|
||||
tests/reports/
|
||||
tests/**/tmp/
|
||||
|
||||
# Répertoires développeur
|
||||
.nvm/
|
||||
.venv/
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
# Système
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Rust (si présent localement)
|
||||
target/
|
||||
|
||||
# Docker (artefacts locaux éventuels)
|
||||
docker-compose.override.yml
|
||||
docker-compose.*.yml.local
|
||||
*.docker.tar
|
||||
docker-image-*.tar
|
||||
docker-save-*.tar
|
||||
.docker/
|
||||
.docker-compose/
|
||||
docker-data/
|
||||
docker-volumes/
|
||||
docker-logs/
|
||||
|
||||
# ihm_client spécifiques
|
||||
ihm_client/.vercel/
|
||||
ihm_client/.pnpm-store/
|
||||
ihm_client/.yarn/**
|
||||
|
||||
# Archives et sauvegardes (ne pas indexer)
|
||||
*.zip
|
||||
*.tar
|
||||
*.tar.gz
|
||||
*.tgz
|
||||
*.gz
|
||||
*.bz2
|
||||
*.xz
|
||||
*.zst
|
||||
*.7z
|
||||
*.rar
|
||||
*.iso
|
||||
*.bak
|
||||
*.backup
|
||||
*.old
|
||||
*.orig
|
||||
|
||||
# Répertoire d’archives du projet
|
||||
archive/
|
||||
|
||||
# Dumps SQL et exports de bases de données
|
||||
*.sql
|
||||
*.sql.gz
|
||||
*.dump
|
||||
*.dmp
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
*.db
|
||||
*.db3
|
||||
*.bak.sql
|
||||
sql_dumps/
|
||||
db_dumps/
|
||||
database_dumps/
|
||||
backups/sql/
|
||||
|
||||
!.cursor/
|
||||
|
||||
!AGENTS.md
|
3
.env
3
.env
@ -1,3 +1,4 @@
|
||||
# .env
|
||||
VITE_API_URL=https://api.example.com
|
||||
VITE_API_KEY=your_api_key
|
||||
VITE_API_KEY=your_api_key
|
||||
VITE_JWT_SECRET_KEY="your_secret_key"
|
||||
|
97
.gitea/.gitea/ISSUE_TEMPLATE/bug_report.md
Normal file
97
.gitea/.gitea/ISSUE_TEMPLATE/bug_report.md
Normal file
@ -0,0 +1,97 @@
|
||||
---
|
||||
name: Bug Report
|
||||
about: Signaler un bug pour nous aider à améliorer 4NK Node
|
||||
title: '[BUG] '
|
||||
labels: ['bug', 'needs-triage']
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## 🐛 Description du Bug
|
||||
|
||||
Description claire et concise du problème.
|
||||
|
||||
## 🔄 Étapes pour Reproduire
|
||||
|
||||
1. Aller à '...'
|
||||
2. Cliquer sur '...'
|
||||
3. Faire défiler jusqu'à '...'
|
||||
4. Voir l'erreur
|
||||
|
||||
## ✅ Comportement Attendu
|
||||
|
||||
Description de ce qui devrait se passer.
|
||||
|
||||
## ❌ Comportement Actuel
|
||||
|
||||
Description de ce qui se passe actuellement.
|
||||
|
||||
## 📸 Capture d'Écran
|
||||
|
||||
Si applicable, ajoutez une capture d'écran pour expliquer votre problème.
|
||||
|
||||
## 💻 Informations Système
|
||||
|
||||
- **OS** : [ex: Ubuntu 20.04, macOS 12.0, Windows 11]
|
||||
- **Docker** : [ex: 20.10.0]
|
||||
- **Docker Compose** : [ex: 2.0.0]
|
||||
- **Version 4NK Node** : [ex: v1.0.0]
|
||||
- **Architecture** : [ex: x86_64, ARM64]
|
||||
|
||||
## 📋 Configuration
|
||||
|
||||
### Services Actifs
|
||||
```bash
|
||||
docker ps
|
||||
```
|
||||
|
||||
### Variables d'Environnement
|
||||
```bash
|
||||
# Bitcoin Core
|
||||
BITCOIN_NETWORK=signet
|
||||
BITCOIN_RPC_PORT=18443
|
||||
|
||||
# Blindbit
|
||||
BLINDBIT_PORT=8000
|
||||
|
||||
# SDK Relay
|
||||
SDK_RELAY_PORTS=8090-8095
|
||||
```
|
||||
|
||||
## 📝 Logs
|
||||
|
||||
### Logs Pertinents
|
||||
```
|
||||
Logs pertinents ici
|
||||
```
|
||||
|
||||
### Logs d'Erreur
|
||||
```
|
||||
Logs d'erreur ici
|
||||
```
|
||||
|
||||
### Logs de Debug
|
||||
```
|
||||
Logs de debug ici (si RUST_LOG=debug)
|
||||
```
|
||||
|
||||
## 🔧 Tentatives de Résolution
|
||||
|
||||
- [ ] Redémarrage des services
|
||||
- [ ] Nettoyage des volumes Docker
|
||||
- [ ] Vérification de la connectivité réseau
|
||||
- [ ] Mise à jour des dépendances
|
||||
- [ ] Vérification de la configuration
|
||||
|
||||
## 📚 Contexte Supplémentaire
|
||||
|
||||
Toute autre information pertinente sur le problème.
|
||||
|
||||
## 🔗 Liens Utiles
|
||||
|
||||
- [Documentation](docs/)
|
||||
- [Guide de Dépannage](docs/TROUBLESHOOTING.md)
|
||||
- [Issues Similaires](https://git.4nkweb.com/4nk/4NK_node/issues?q=is%3Aissue+is%3Aopen+label%3Abug)
|
||||
|
||||
---
|
||||
|
||||
**Merci de votre contribution !** 🙏
|
156
.gitea/.gitea/ISSUE_TEMPLATE/feature_request.md
Normal file
156
.gitea/.gitea/ISSUE_TEMPLATE/feature_request.md
Normal file
@ -0,0 +1,156 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Proposer une nouvelle fonctionnalité pour 4NK Node
|
||||
title: '[FEATURE] '
|
||||
labels: ['enhancement', 'needs-triage']
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## 🚀 Résumé
|
||||
|
||||
Description claire et concise de la fonctionnalité souhaitée.
|
||||
|
||||
## 💡 Motivation
|
||||
|
||||
Pourquoi cette fonctionnalité est-elle nécessaire ? Quels problèmes résout-elle ?
|
||||
|
||||
### Problèmes Actuels
|
||||
- Problème 1
|
||||
- Problème 2
|
||||
- Problème 3
|
||||
|
||||
### Avantages de la Solution
|
||||
- Avantage 1
|
||||
- Avantage 2
|
||||
- Avantage 3
|
||||
|
||||
## 🎯 Proposition
|
||||
|
||||
Description détaillée de la fonctionnalité proposée.
|
||||
|
||||
### Fonctionnalités Principales
|
||||
- [ ] Fonctionnalité 1
|
||||
- [ ] Fonctionnalité 2
|
||||
- [ ] Fonctionnalité 3
|
||||
|
||||
### Interface Utilisateur
|
||||
Description de l'interface utilisateur si applicable.
|
||||
|
||||
### API Changes
|
||||
Description des changements d'API si applicable.
|
||||
|
||||
## 🔄 Alternatives Considérées
|
||||
|
||||
Autres solutions envisagées et pourquoi elles n'ont pas été choisies.
|
||||
|
||||
### Alternative 1
|
||||
- **Description** : ...
|
||||
- **Pourquoi rejetée** : ...
|
||||
|
||||
### Alternative 2
|
||||
- **Description** : ...
|
||||
- **Pourquoi rejetée** : ...
|
||||
|
||||
## 📊 Impact
|
||||
|
||||
### Impact sur les Utilisateurs
|
||||
- Impact positif 1
|
||||
- Impact positif 2
|
||||
- Impact négatif potentiel (si applicable)
|
||||
|
||||
### Impact sur l'Architecture
|
||||
- Changements nécessaires
|
||||
- Compatibilité avec l'existant
|
||||
- Performance
|
||||
|
||||
### Impact sur la Maintenance
|
||||
- Complexité ajoutée
|
||||
- Tests nécessaires
|
||||
- Documentation requise
|
||||
|
||||
## 💻 Exemples d'Utilisation
|
||||
|
||||
### Cas d'Usage 1
|
||||
```bash
|
||||
# Exemple de commande ou configuration
|
||||
```
|
||||
|
||||
### Cas d'Usage 2
|
||||
```python
|
||||
# Exemple de code Python
|
||||
```
|
||||
|
||||
### Cas d'Usage 3
|
||||
```javascript
|
||||
// Exemple de code JavaScript
|
||||
```
|
||||
|
||||
## 🧪 Tests
|
||||
|
||||
### Tests Nécessaires
|
||||
- [ ] Tests unitaires
|
||||
- [ ] Tests d'intégration
|
||||
- [ ] Tests de performance
|
||||
- [ ] Tests de sécurité
|
||||
- [ ] Tests de compatibilité
|
||||
|
||||
### Scénarios de Test
|
||||
- Scénario 1
|
||||
- Scénario 2
|
||||
- Scénario 3
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
### Documentation Requise
|
||||
- [ ] Guide d'utilisation
|
||||
- [ ] Documentation API
|
||||
- [ ] Exemples de code
|
||||
- [ ] Guide de migration
|
||||
- [ ] FAQ
|
||||
|
||||
## 🔧 Implémentation
|
||||
|
||||
### Étapes Proposées
|
||||
1. **Phase 1** : [Description]
|
||||
2. **Phase 2** : [Description]
|
||||
3. **Phase 3** : [Description]
|
||||
|
||||
### Estimation de Temps
|
||||
- **Développement** : X jours/semaines
|
||||
- **Tests** : X jours/semaines
|
||||
- **Documentation** : X jours/semaines
|
||||
- **Total** : X jours/semaines
|
||||
|
||||
### Ressources Nécessaires
|
||||
- Développeur(s)
|
||||
- Testeur(s)
|
||||
- Documentateur(s)
|
||||
- Infrastructure
|
||||
|
||||
## 🎯 Critères de Succès
|
||||
|
||||
Comment mesurer le succès de cette fonctionnalité ?
|
||||
|
||||
- [ ] Critère 1
|
||||
- [ ] Critère 2
|
||||
- [ ] Critère 3
|
||||
|
||||
## 🔗 Liens Utiles
|
||||
|
||||
- [Documentation existante](docs/)
|
||||
- [Issues similaires](https://git.4nkweb.com/4nk/4NK_node/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement)
|
||||
- [Roadmap](https://git.4nkweb.com/4nk/4NK_node/projects)
|
||||
- [Discussions](https://git.4nkweb.com/4nk/4NK_node/issues)
|
||||
|
||||
## 📋 Checklist
|
||||
|
||||
- [ ] J'ai vérifié que cette fonctionnalité n'existe pas déjà
|
||||
- [ ] J'ai lu la documentation existante
|
||||
- [ ] J'ai vérifié les issues similaires
|
||||
- [ ] J'ai fourni des exemples d'utilisation
|
||||
- [ ] J'ai considéré l'impact sur l'existant
|
||||
- [ ] J'ai proposé des tests
|
||||
|
||||
---
|
||||
|
||||
**Merci de votre contribution à l'amélioration de 4NK Node !** 🌟
|
180
.gitea/.gitea/PULL_REQUEST_TEMPLATE.md
Normal file
180
.gitea/.gitea/PULL_REQUEST_TEMPLATE.md
Normal file
@ -0,0 +1,180 @@
|
||||
# Pull Request - 4NK Node
|
||||
|
||||
## 📋 Description
|
||||
|
||||
Description claire et concise des changements apportés.
|
||||
|
||||
### Type de Changement
|
||||
- [ ] 🐛 Bug fix
|
||||
- [ ] ✨ Nouvelle fonctionnalité
|
||||
- [ ] 📚 Documentation
|
||||
- [ ] 🧪 Tests
|
||||
- [ ] 🔧 Refactoring
|
||||
- [ ] 🚀 Performance
|
||||
- [ ] 🔒 Sécurité
|
||||
- [ ] 🎨 Style/UI
|
||||
- [ ] 🏗️ Architecture
|
||||
- [ ] 📦 Build/CI
|
||||
|
||||
### Composants Affectés
|
||||
- [ ] Bitcoin Core
|
||||
- [ ] Blindbit
|
||||
- [ ] SDK Relay
|
||||
- [ ] Tor
|
||||
- [ ] Docker/Infrastructure
|
||||
- [ ] Tests
|
||||
- [ ] Documentation
|
||||
- [ ] Scripts
|
||||
|
||||
## 🔗 Issue(s) Liée(s)
|
||||
|
||||
Fixes #(issue)
|
||||
Relates to #(issue)
|
||||
|
||||
## 🧪 Tests
|
||||
|
||||
### Tests Exécutés
|
||||
- [ ] Tests unitaires
|
||||
- [ ] Tests d'intégration
|
||||
- [ ] Tests de connectivité
|
||||
- [ ] Tests externes
|
||||
- [ ] Tests de performance
|
||||
|
||||
### Commandes de Test
|
||||
```bash
|
||||
# Tests complets
|
||||
./tests/run_all_tests.sh
|
||||
|
||||
# Tests spécifiques
|
||||
./tests/run_unit_tests.sh
|
||||
./tests/run_integration_tests.sh
|
||||
```
|
||||
|
||||
### Résultats des Tests
|
||||
```
|
||||
Résultats des tests ici
|
||||
```
|
||||
|
||||
## 📸 Captures d'Écran
|
||||
|
||||
Si applicable, ajoutez des captures d'écran pour les changements visuels.
|
||||
|
||||
## 🔧 Changements Techniques
|
||||
|
||||
### Fichiers Modifiés
|
||||
- `fichier1.rs` - Description des changements
|
||||
- `fichier2.py` - Description des changements
|
||||
- `docker-compose.yml` - Description des changements
|
||||
|
||||
### Nouveaux Fichiers
|
||||
- `nouveau_fichier.rs` - Description
|
||||
- `nouveau_script.sh` - Description
|
||||
|
||||
### Fichiers Supprimés
|
||||
- `ancien_fichier.rs` - Raison de la suppression
|
||||
|
||||
### Changements de Configuration
|
||||
```yaml
|
||||
# Exemple de changement de configuration
|
||||
service:
|
||||
new_option: value
|
||||
```
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
### Documentation Mise à Jour
|
||||
- [ ] README.md
|
||||
- [ ] docs/INSTALLATION.md
|
||||
- [ ] docs/USAGE.md
|
||||
- [ ] docs/API.md
|
||||
- [ ] docs/ARCHITECTURE.md
|
||||
|
||||
### Nouvelle Documentation
|
||||
- [ ] Nouveau guide créé
|
||||
- [ ] Exemples ajoutés
|
||||
- [ ] API documentée
|
||||
|
||||
## 🔍 Code Review Checklist
|
||||
|
||||
### Code Quality
|
||||
- [ ] Le code suit les standards du projet
|
||||
- [ ] Les noms de variables/fonctions sont clairs
|
||||
- [ ] Les commentaires sont appropriés
|
||||
- [ ] Pas de code mort ou commenté
|
||||
- [ ] Gestion d'erreurs appropriée
|
||||
|
||||
### Performance
|
||||
- [ ] Pas de régression de performance
|
||||
- [ ] Optimisations appliquées si nécessaire
|
||||
- [ ] Tests de performance ajoutés
|
||||
|
||||
### Sécurité
|
||||
- [ ] Pas de vulnérabilités introduites
|
||||
- [ ] Validation des entrées utilisateur
|
||||
- [ ] Gestion sécurisée des secrets
|
||||
|
||||
### Tests
|
||||
- [ ] Couverture de tests suffisante
|
||||
- [ ] Tests pour les cas d'erreur
|
||||
- [ ] Tests d'intégration si nécessaire
|
||||
|
||||
### Documentation
|
||||
- [ ] Code auto-documenté
|
||||
- [ ] Documentation mise à jour
|
||||
- [ ] Exemples fournis
|
||||
|
||||
## 🚀 Déploiement
|
||||
|
||||
### Impact sur le Déploiement
|
||||
- [ ] Aucun impact
|
||||
- [ ] Migration de données requise
|
||||
- [ ] Changement de configuration
|
||||
- [ ] Redémarrage des services
|
||||
|
||||
### Étapes de Déploiement
|
||||
```bash
|
||||
# Étapes pour déployer les changements
|
||||
```
|
||||
|
||||
## 📊 Métriques
|
||||
|
||||
### Impact sur les Performances
|
||||
- Temps de réponse : +/- X%
|
||||
- Utilisation mémoire : +/- X%
|
||||
- Utilisation CPU : +/- X%
|
||||
|
||||
### Impact sur la Stabilité
|
||||
- Taux d'erreur : +/- X%
|
||||
- Disponibilité : +/- X%
|
||||
|
||||
## 🔄 Compatibilité
|
||||
|
||||
### Compatibilité Ascendante
|
||||
- [ ] Compatible avec les versions précédentes
|
||||
- [ ] Migration automatique
|
||||
- [ ] Migration manuelle requise
|
||||
|
||||
### Compatibilité Descendante
|
||||
- [ ] Compatible avec les futures versions
|
||||
- [ ] API stable
|
||||
- [ ] Configuration stable
|
||||
|
||||
## 🎯 Critères de Succès
|
||||
|
||||
- [ ] Critère 1
|
||||
- [ ] Critère 2
|
||||
- [ ] Critère 3
|
||||
|
||||
## 📝 Notes Supplémentaires
|
||||
|
||||
Informations supplémentaires importantes pour les reviewers.
|
||||
|
||||
## 🔗 Liens Utiles
|
||||
|
||||
- [Documentation](docs/)
|
||||
- [Tests](tests/)
|
||||
- [Issues liées](https://git.4nkweb.com/4nk/4NK_node/issues)
|
||||
|
||||
---
|
||||
|
||||
**Merci pour votre contribution !** 🙏
|
14
.gitea/.gitea/workflows/LOCAL_OVERRIDES.yml
Normal file
14
.gitea/.gitea/workflows/LOCAL_OVERRIDES.yml
Normal file
@ -0,0 +1,14 @@
|
||||
# LOCAL_OVERRIDES.yml — dérogations locales contrôlées
|
||||
overrides:
|
||||
- path: ".gitea/workflows/ci.yml"
|
||||
reason: "spécificité d’environnement"
|
||||
owner: "@maintainer_handle"
|
||||
expires: "2025-12-31"
|
||||
- path: "scripts/auto-ssh-push.sh"
|
||||
reason: "flux particulier temporaire"
|
||||
owner: "@maintainer_handle"
|
||||
expires: "2025-10-01"
|
||||
policy:
|
||||
allow_only_listed_paths: true
|
||||
require_expiry: true
|
||||
audit_in_ci: true
|
345
.gitea/.gitea/workflows/ci.yml
Normal file
345
.gitea/.gitea/workflows/ci.yml
Normal file
@ -0,0 +1,345 @@
|
||||
name: CI - 4NK Node
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, develop ]
|
||||
pull_request:
|
||||
branches: [ main, develop ]
|
||||
|
||||
env:
|
||||
RUST_VERSION: '1.70'
|
||||
DOCKER_COMPOSE_VERSION: '2.20.0'
|
||||
|
||||
jobs:
|
||||
# Job de vérification du code
|
||||
code-quality:
|
||||
name: Code Quality
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Rust
|
||||
uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: ${{ env.RUST_VERSION }}
|
||||
override: true
|
||||
|
||||
- name: Cache Rust dependencies
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
~/.cargo/git
|
||||
target
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cargo-
|
||||
|
||||
- name: Run clippy
|
||||
run: |
|
||||
cd sdk_relay
|
||||
cargo clippy --all-targets --all-features -- -D warnings
|
||||
|
||||
- name: Run rustfmt
|
||||
run: |
|
||||
cd sdk_relay
|
||||
cargo fmt --all -- --check
|
||||
|
||||
- name: Check documentation
|
||||
run: |
|
||||
cd sdk_relay
|
||||
cargo doc --no-deps
|
||||
|
||||
- name: Check for TODO/FIXME
|
||||
run: |
|
||||
if grep -r "TODO\|FIXME" . --exclude-dir=.git --exclude-dir=target; then
|
||||
echo "Found TODO/FIXME comments. Please address them."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Job de tests unitaires
|
||||
unit-tests:
|
||||
name: Unit Tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Rust
|
||||
uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: ${{ env.RUST_VERSION }}
|
||||
override: true
|
||||
|
||||
- name: Cache Rust dependencies
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
~/.cargo/git
|
||||
target
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cargo-
|
||||
|
||||
- name: Run unit tests
|
||||
run: |
|
||||
cd sdk_relay
|
||||
cargo test --lib --bins
|
||||
|
||||
- name: Run integration tests
|
||||
run: |
|
||||
cd sdk_relay
|
||||
cargo test --tests
|
||||
|
||||
# Job de tests d'intégration
|
||||
integration-tests:
|
||||
name: Integration Tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
services:
|
||||
docker:
|
||||
image: docker:24.0.5
|
||||
options: >-
|
||||
--health-cmd "docker info"
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
ports:
|
||||
- 2375:2375
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build Docker images
|
||||
run: |
|
||||
docker build -t 4nk-node-bitcoin ./bitcoin
|
||||
docker build -t 4nk-node-blindbit ./blindbit
|
||||
docker build -t 4nk-node-sdk-relay -f ./sdk_relay/Dockerfile ..
|
||||
|
||||
- name: Run integration tests
|
||||
run: |
|
||||
# Tests de connectivité de base
|
||||
./tests/run_connectivity_tests.sh || true
|
||||
|
||||
# Tests d'intégration
|
||||
./tests/run_integration_tests.sh || true
|
||||
|
||||
- name: Upload test results
|
||||
uses: actions/upload-artifact@v3
|
||||
if: always()
|
||||
with:
|
||||
name: test-results
|
||||
path: |
|
||||
tests/logs/
|
||||
tests/reports/
|
||||
retention-days: 7
|
||||
|
||||
# Job de tests de sécurité
|
||||
security-tests:
|
||||
name: Security Tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Rust
|
||||
uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: ${{ env.RUST_VERSION }}
|
||||
override: true
|
||||
|
||||
- name: Run cargo audit
|
||||
run: |
|
||||
cd sdk_relay
|
||||
cargo audit --deny warnings
|
||||
|
||||
- name: Check for secrets
|
||||
run: |
|
||||
# Vérifier les secrets potentiels
|
||||
if grep -r "password\|secret\|key\|token" . --exclude-dir=.git --exclude-dir=target --exclude=*.md; then
|
||||
echo "Potential secrets found. Please review."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Check file permissions
|
||||
run: |
|
||||
# Vérifier les permissions sensibles
|
||||
find . -type f -perm /0111 -name "*.conf" -o -name "*.key" -o -name "*.pem" | while read file; do
|
||||
if [[ $(stat -c %a "$file") != "600" ]]; then
|
||||
echo "Warning: $file has insecure permissions"
|
||||
fi
|
||||
done
|
||||
|
||||
# Job de build et test Docker
|
||||
docker-build:
|
||||
name: Docker Build & Test
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
services:
|
||||
docker:
|
||||
image: docker:24.0.5
|
||||
options: >-
|
||||
--health-cmd "docker info"
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
ports:
|
||||
- 2375:2375
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build and test Bitcoin Core
|
||||
run: |
|
||||
docker build -t 4nk-node-bitcoin:test ./bitcoin
|
||||
docker run --rm 4nk-node-bitcoin:test bitcoin-cli --version
|
||||
|
||||
- name: Build and test Blindbit
|
||||
run: |
|
||||
docker build -t 4nk-node-blindbit:test ./blindbit
|
||||
docker run --rm 4nk-node-blindbit:test --version || true
|
||||
|
||||
- name: Build and test SDK Relay
|
||||
run: |
|
||||
docker build -t 4nk-node-sdk-relay:test -f ./sdk_relay/Dockerfile ..
|
||||
docker run --rm 4nk-node-sdk-relay:test --version || true
|
||||
|
||||
- name: Test Docker Compose
|
||||
run: |
|
||||
docker-compose config
|
||||
docker-compose build --no-cache
|
||||
|
||||
# Job de tests de documentation
|
||||
documentation-tests:
|
||||
name: Documentation Tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Check markdown links
|
||||
run: |
|
||||
# Vérification basique des liens markdown
|
||||
find . -name "*.md" -exec grep -l "\[.*\](" {} \; | while read file; do
|
||||
echo "Checking links in $file"
|
||||
done
|
||||
|
||||
- name: Check documentation structure
|
||||
run: |
|
||||
# Vérifier la présence des fichiers de documentation essentiels
|
||||
required_files=(
|
||||
"README.md"
|
||||
"LICENSE"
|
||||
"CONTRIBUTING.md"
|
||||
"CHANGELOG.md"
|
||||
"CODE_OF_CONDUCT.md"
|
||||
"SECURITY.md"
|
||||
"docs/INDEX.md"
|
||||
"docs/INSTALLATION.md"
|
||||
"docs/USAGE.md"
|
||||
)
|
||||
|
||||
for file in "${required_files[@]}"; do
|
||||
if [[ ! -f "$file" ]]; then
|
||||
echo "Missing required documentation file: $file"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Validate documentation
|
||||
run: |
|
||||
# Vérifier la cohérence de la documentation
|
||||
if ! grep -q "4NK Node" README.md; then
|
||||
echo "README.md should mention '4NK Node'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Job de release guard (cohérence release)
|
||||
release-guard:
|
||||
name: Release Guard
|
||||
runs-on: ubuntu-latest
|
||||
needs: [code-quality, unit-tests, documentation-tests]
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Ensure guard scripts are executable
|
||||
run: |
|
||||
chmod +x scripts/release/guard.sh || true
|
||||
chmod +x scripts/checks/version_alignment.sh || true
|
||||
|
||||
- name: Version alignment check
|
||||
run: |
|
||||
if [ -f scripts/checks/version_alignment.sh ]; then
|
||||
./scripts/checks/version_alignment.sh
|
||||
else
|
||||
echo "No version alignment script (ok)"
|
||||
fi
|
||||
|
||||
- name: Release guard (CI verify)
|
||||
env:
|
||||
RELEASE_TYPE: ci-verify
|
||||
run: |
|
||||
if [ -f scripts/release/guard.sh ]; then
|
||||
./scripts/release/guard.sh
|
||||
else
|
||||
echo "No guard script (ok)"
|
||||
fi
|
||||
|
||||
# Job de tests de performance
|
||||
performance-tests:
|
||||
name: Performance Tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Rust
|
||||
uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: ${{ env.RUST_VERSION }}
|
||||
override: true
|
||||
|
||||
- name: Run performance tests
|
||||
run: |
|
||||
cd sdk_relay
|
||||
cargo test --release --test performance_tests || true
|
||||
|
||||
- name: Check memory usage
|
||||
run: |
|
||||
# Tests de base de consommation mémoire
|
||||
echo "Performance tests completed"
|
||||
|
||||
# Job de notification
|
||||
notify:
|
||||
name: Notify
|
||||
runs-on: ubuntu-latest
|
||||
needs: [code-quality, unit-tests, integration-tests, security-tests, docker-build, documentation-tests]
|
||||
if: always()
|
||||
|
||||
steps:
|
||||
- name: Notify success
|
||||
if: needs.code-quality.result == 'success' && needs.unit-tests.result == 'success' && needs.integration-tests.result == 'success' && needs.security-tests.result == 'success' && needs.docker-build.result == 'success' && needs.documentation-tests.result == 'success'
|
||||
run: |
|
||||
echo "✅ All tests passed successfully!"
|
||||
|
||||
- name: Notify failure
|
||||
if: needs.code-quality.result == 'failure' || needs.unit-tests.result == 'failure' || needs.integration-tests.result == 'failure' || needs.security-tests.result == 'failure' || needs.docker-build.result == 'failure' || needs.documentation-tests.result == 'failure'
|
||||
run: |
|
||||
echo "❌ Some tests failed!"
|
||||
exit 1
|
39
.gitea/.gitea/workflows/template-sync.yml
Normal file
39
.gitea/.gitea/workflows/template-sync.yml
Normal file
@ -0,0 +1,39 @@
|
||||
# .gitea/workflows/template-sync.yml — synchronisation et contrôles d’intégrité
|
||||
name: 4NK Template Sync
|
||||
on:
|
||||
schedule: # planification régulière
|
||||
- cron: "0 4 * * 1" # exécution hebdomadaire (UTC)
|
||||
workflow_dispatch: {} # déclenchement manuel
|
||||
|
||||
jobs:
|
||||
check-and-sync:
|
||||
runs-on: linux
|
||||
steps:
|
||||
- name: Lire TEMPLATE_VERSION et .4nk-sync.yml
|
||||
# Doit charger ref courant, source_repo et périmètre paths
|
||||
|
||||
- name: Récupérer la version publiée du template/4NK_rules
|
||||
# Doit comparer TEMPLATE_VERSION avec ref amont
|
||||
|
||||
- name: Créer branche de synchronisation si divergence
|
||||
# Doit créer chore/template-sync-<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
|
39
.gitea/ISSUE_TEMPLATE/bug_report.md
Normal file
39
.gitea/ISSUE_TEMPLATE/bug_report.md
Normal file
@ -0,0 +1,39 @@
|
||||
---
|
||||
name: Rapport de bug
|
||||
about: Créer un rapport pour nous aider à améliorer l'interface utilisateur 4NK
|
||||
title: '[BUG] '
|
||||
labels: ['bug', 'needs-triage']
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## Description du bug
|
||||
Une description claire et concise du bug.
|
||||
|
||||
## Étapes pour reproduire
|
||||
1. Aller à '...'
|
||||
2. Cliquer sur '...'
|
||||
3. Faire défiler jusqu'à '...'
|
||||
4. Voir l'erreur
|
||||
|
||||
## Comportement attendu
|
||||
Une description claire et concise de ce que vous attendiez.
|
||||
|
||||
## Captures d'écran
|
||||
Si applicable, ajoutez des captures d'écran pour expliquer votre problème.
|
||||
|
||||
## Environnement
|
||||
- OS: [ex. iOS]
|
||||
- Navigateur: [ex. chrome, safari]
|
||||
- Version: [ex. 22]
|
||||
- Version de l'application: [ex. 1.0.0]
|
||||
|
||||
## Contexte supplémentaire
|
||||
Ajoutez tout autre contexte concernant le problème ici.
|
||||
|
||||
## Logs
|
||||
Si applicable, ajoutez les logs d'erreur du navigateur ou de l'application.
|
||||
|
||||
## Checklist
|
||||
- [ ] J'ai vérifié que le bug n'a pas déjà été signalé
|
||||
- [ ] J'ai fourni toutes les informations nécessaires pour reproduire le bug
|
||||
- [ ] J'ai testé sur différents navigateurs/environnements
|
46
.gitea/ISSUE_TEMPLATE/feature_request.md
Normal file
46
.gitea/ISSUE_TEMPLATE/feature_request.md
Normal file
@ -0,0 +1,46 @@
|
||||
---
|
||||
name: Demande de fonctionnalité
|
||||
about: Suggérer une idée pour l'interface utilisateur 4NK
|
||||
title: '[FEATURE] '
|
||||
labels: ['enhancement', 'needs-triage']
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## Problème lié
|
||||
Une description claire et concise du problème que cette fonctionnalité résoudrait.
|
||||
|
||||
Exemple: Handshake iframe fragile (courses à l'init) entre parent et `ihm_client`.
|
||||
|
||||
## Solution proposée
|
||||
Une description claire et concise de ce que vous voulez qu'il se passe.
|
||||
|
||||
Proposition: protocole READY → LISTENING → REQUEST_LINK avec ACKs, timeouts et retries exponentiels; validation stricte de `origin` et corrélation `messageId`.
|
||||
|
||||
## Alternatives considérées
|
||||
Une description claire et concise de toutes les solutions ou fonctionnalités alternatives que vous avez considérées.
|
||||
|
||||
## Contexte supplémentaire
|
||||
Ajoutez tout autre contexte ou captures d'écran concernant la demande de fonctionnalité ici.
|
||||
|
||||
Critères d’acceptation:
|
||||
- Pas de course observée (100 itérations CI)
|
||||
- Compatibilité ascendante des intégrations existantes
|
||||
|
||||
## Impact utilisateur
|
||||
- [ ] Améliore l'expérience utilisateur
|
||||
- [ ] Corrige un problème de performance
|
||||
- [ ] Ajoute une fonctionnalité manquante
|
||||
- [ ] Améliore l'accessibilité
|
||||
- [ ] Autre (précisez)
|
||||
|
||||
## Priorité
|
||||
- [ ] Critique
|
||||
- [ ] Haute
|
||||
- [ ] Moyenne
|
||||
- [ ] Basse
|
||||
|
||||
## Checklist
|
||||
- [ ] J'ai vérifié que cette fonctionnalité n'a pas déjà été demandée
|
||||
- [ ] J'ai fourni une description claire du besoin
|
||||
- [ ] J'ai considéré les alternatives
|
||||
- [ ] J'ai évalué l'impact sur les utilisateurs existants
|
30
.gitea/PULL_REQUEST_TEMPLATE.md
Normal file
30
.gitea/PULL_REQUEST_TEMPLATE.md
Normal file
@ -0,0 +1,30 @@
|
||||
## Description
|
||||
Une description claire et concise des changements apportés.
|
||||
|
||||
## Type de changement
|
||||
- [ ] Correction de bug (changement non-breaking qui corrige un problème)
|
||||
- [ ] Nouvelle fonctionnalité (changement non-breaking qui ajoute une fonctionnalité)
|
||||
- [ ] Breaking change (correction ou fonctionnalité qui causerait un comportement existant à ne pas fonctionner comme prévu)
|
||||
- [ ] Documentation (mise à jour de la documentation)
|
||||
|
||||
## Tests
|
||||
- [ ] J'ai exécuté les tests unitaires
|
||||
- [ ] J'ai exécuté les tests d'intégration
|
||||
- [ ] J'ai testé manuellement les changements
|
||||
- [ ] J'ai vérifié la compatibilité avec les navigateurs cibles
|
||||
|
||||
## Checklist
|
||||
- [ ] Mon code suit les conventions de style du projet
|
||||
- [ ] J'ai effectué un auto-review de mon propre code
|
||||
- [ ] J'ai commenté mon code, particulièrement dans les zones difficiles à comprendre
|
||||
- [ ] J'ai apporté les changements correspondants à la documentation
|
||||
- [ ] Mes changements ne génèrent pas de nouveaux warnings
|
||||
- [ ] J'ai ajouté des tests qui prouvent que ma correction fonctionne ou que ma fonctionnalité fonctionne
|
||||
- [ ] Les tests unitaires et d'intégration passent avec mes changements
|
||||
- [ ] J'ai vérifié que mes changements n'affectent pas négativement les performances
|
||||
|
||||
## Captures d'écran (si applicable)
|
||||
Ajoutez des captures d'écran pour montrer les changements visuels.
|
||||
|
||||
## Informations supplémentaires
|
||||
Toute autre information ou contexte que vous souhaitez ajouter.
|
14
.gitea/workflows/LOCAL_OVERRIDES.yml
Normal file
14
.gitea/workflows/LOCAL_OVERRIDES.yml
Normal file
@ -0,0 +1,14 @@
|
||||
# LOCAL_OVERRIDES.yml — dérogations locales contrôlées
|
||||
overrides:
|
||||
- path: ".gitea/workflows/ci.yml"
|
||||
reason: "spécificité d’environnement"
|
||||
owner: "@maintainer_handle"
|
||||
expires: "2025-12-31"
|
||||
- path: "scripts/auto-ssh-push.sh"
|
||||
reason: "flux particulier temporaire"
|
||||
owner: "@maintainer_handle"
|
||||
expires: "2025-10-01"
|
||||
policy:
|
||||
allow_only_listed_paths: true
|
||||
require_expiry: true
|
||||
audit_in_ci: true
|
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
|
87
.gitea/workflows/ci.yml.bak
Normal file
87
.gitea/workflows/ci.yml.bak
Normal file
@ -0,0 +1,87 @@
|
||||
name: CI - ihm_client
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, develop ]
|
||||
pull_request:
|
||||
branches: [ main, develop ]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Run linting
|
||||
run: npm run lint
|
||||
|
||||
- name: Run type checking
|
||||
run: npm run type-check
|
||||
|
||||
- name: Run tests
|
||||
run: npm run test
|
||||
|
||||
- name: Build application
|
||||
run: npm run build
|
||||
|
||||
- name: Install Playwright browsers
|
||||
run: npm run e2e:install
|
||||
|
||||
- name: Run E2E tests
|
||||
run: npm run test:e2e
|
||||
|
||||
- name: Test Docker build (artefacts)
|
||||
run: |
|
||||
docker build -t ihm-client:dist .
|
||||
docker image rm ihm-client:dist
|
||||
|
||||
security:
|
||||
runs-on: ubuntu-latest
|
||||
needs: test
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Run security audit
|
||||
run: npm audit --audit-level=moderate
|
||||
|
||||
- name: Check for known vulnerabilities
|
||||
run: npm audit --audit-level=high
|
||||
|
||||
integration-test:
|
||||
runs-on: ubuntu-latest
|
||||
needs: test
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build Docker artefacts
|
||||
run: |
|
||||
docker build -t ihm-client:dist .
|
||||
docker image rm ihm-client:dist
|
39
.gitea/workflows/template-sync.yml
Normal file
39
.gitea/workflows/template-sync.yml
Normal file
@ -0,0 +1,39 @@
|
||||
# .gitea/workflows/template-sync.yml — synchronisation et contrôles d’intégrité
|
||||
name: 4NK Template Sync
|
||||
on:
|
||||
schedule: # planification régulière
|
||||
- cron: "0 4 * * 1" # exécution hebdomadaire (UTC)
|
||||
workflow_dispatch: {} # déclenchement manuel
|
||||
|
||||
jobs:
|
||||
check-and-sync:
|
||||
runs-on: [self-hosted, 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
|
35
.gitignore
vendored
35
.gitignore
vendored
@ -1,7 +1,38 @@
|
||||
target/
|
||||
pkg/
|
||||
Cargo.lock
|
||||
node_modules/
|
||||
dist/
|
||||
.vscode
|
||||
public/ssl/
|
||||
public/ssl/
|
||||
|
||||
# Temporary dependencies
|
||||
temp-deps/
|
||||
|
||||
# Test coverage
|
||||
coverage/
|
||||
|
||||
# Environment files
|
||||
.env
|
||||
.env.local
|
||||
.env.production
|
||||
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
!.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
|
||||
}
|
||||
}
|
18
.ssh-config
Normal file
18
.ssh-config
Normal file
@ -0,0 +1,18 @@
|
||||
# Configuration SSH automatique pour ihm_client
|
||||
# Généré le lun. 25 août 2025 16:59:11 CEST
|
||||
|
||||
# Configuration Git
|
||||
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||
|
||||
# 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'
|
||||
|
||||
# Test SSH
|
||||
ssh -T git@git.4nkweb.com
|
||||
|
||||
# Scripts disponibles
|
||||
./scripts/auto-ssh-push.sh quick
|
||||
./scripts/auto-ssh-push.sh message "Mon message"
|
||||
git ssh-push "Mon message"
|
||||
git quick-push
|
357
AGENTS.md
Normal file
357
AGENTS.md
Normal file
@ -0,0 +1,357 @@
|
||||
# AGENTS.md - ihm_client
|
||||
|
||||
## Table des matières
|
||||
|
||||
- [Introduction](#introduction)
|
||||
- [Agents fondamentaux](#agents-fondamentaux)
|
||||
- [Agents spécialisés frontend](#agents-spécialisés-frontend)
|
||||
- [Agents spécialisés WASM](#agents-spécialisés-wasm)
|
||||
- [Agents spécialisés tests](#agents-spécialisés-tests)
|
||||
- [Agents documentation](#agents-documentation)
|
||||
- [Agents open source et CI](#agents-open-source-et-ci)
|
||||
- [Agents complémentaires](#agents-complémentaires)
|
||||
- [Matrice de coordination](#matrice-de-coordination)
|
||||
- [Conclusion](#conclusion)
|
||||
|
||||
---
|
||||
|
||||
## Introduction
|
||||
|
||||
Ce document définit les agents, leurs rôles et leurs responsabilités dans le projet `ihm_client`.
|
||||
Chaque agent est assigné à un périmètre clair (frontend, WASM, tests, documentation, CI, gouvernance open source).
|
||||
L'objectif est d'assurer une maintenance cohérente de l'interface utilisateur, une traçabilité complète et une exécution fiable des bonnes pratiques.
|
||||
Les règles détaillées de réalisation et de contrôle sont précisées dans `.cursor/rules/`.
|
||||
|
||||
---
|
||||
|
||||
## Agents fondamentaux
|
||||
|
||||
### Agent Fondation
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Garantir que toute production est en français.
|
||||
- Vérifier l'absence d'exemples de code applicatif dans la base de code.
|
||||
- Imposer l'introduction et/ou conclusion dans chaque contenu.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- Tous fichiers.
|
||||
|
||||
---
|
||||
|
||||
### Agent Structure
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir l'arborescence canonique du projet.
|
||||
- Déplacer les documents obsolètes vers `archive/`.
|
||||
- Bloquer toute suppression non documentée.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `archive/`, `docs/`, `tests/`, `.gitea/`, `CHANGELOG.md`.
|
||||
|
||||
---
|
||||
|
||||
## Agents spécialisés frontend
|
||||
|
||||
### Agent Vue.js
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la qualité du code Vue.js.
|
||||
- Assurer la cohérence des composants.
|
||||
- Optimiser les performances de l'interface.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `src/components/`, `src/pages/`, `src/services/`.
|
||||
|
||||
---
|
||||
|
||||
### Agent TypeScript
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la qualité du code TypeScript.
|
||||
- Assurer la cohérence des types.
|
||||
- Optimiser la compilation TypeScript.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `src/types/`, `tsconfig.json`, `vite.config.ts`.
|
||||
|
||||
---
|
||||
|
||||
### Agent UI/UX
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la cohérence de l'interface utilisateur.
|
||||
- Assurer l'accessibilité.
|
||||
- Optimiser l'expérience utilisateur.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `src/components/`, `src/pages/`, `src/assets/`.
|
||||
|
||||
---
|
||||
|
||||
## Agents spécialisés WASM
|
||||
|
||||
### Agent Rust
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la qualité du code Rust.
|
||||
- Assurer la sécurité de la mémoire.
|
||||
- Optimiser les performances WASM.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `temp-deps/sdk_client/`, `temp-deps/sdk_common/`.
|
||||
|
||||
---
|
||||
|
||||
### Agent WASM
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la compilation WASM.
|
||||
- Assurer l'intégration avec le frontend.
|
||||
- Optimiser la taille du bundle WASM.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `pkg/`, `scripts/setup-remote-deps.sh`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Silent Payments
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir l'intégration des Silent Payments.
|
||||
- Assurer la sécurité des transactions.
|
||||
- Optimiser les performances de paiement.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `src/services/`, `src/types/sdk_client.d.ts`.
|
||||
|
||||
---
|
||||
|
||||
## Agents spécialisés tests
|
||||
|
||||
### Agent Tests Frontend
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la couverture des tests frontend.
|
||||
- Assurer la qualité des tests Vue.js.
|
||||
- Optimiser l'exécution des tests.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `tests/unit/`, `tests/integration/`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Tests WASM
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la couverture des tests WASM.
|
||||
- Assurer la qualité des tests Rust.
|
||||
- Optimiser l'exécution des tests WASM.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `temp-deps/sdk_client/tests/`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Tests E2E
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la couverture des tests end-to-end.
|
||||
- Assurer la qualité des tests d'intégration.
|
||||
- Optimiser l'exécution des tests E2E.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `tests/e2e/`, `tests/performance/`.
|
||||
|
||||
---
|
||||
|
||||
## Agents documentation
|
||||
|
||||
### Agent Documentation
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Mettre à jour les fichiers de `docs/` selon l'impact des changements.
|
||||
- Maintenir `README.md` comme documentation principale.
|
||||
- Produire des REX techniques dans `archive/`.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `docs/`, `README.md`, `CHANGELOG.md`.
|
||||
|
||||
---
|
||||
|
||||
### Agent API Documentation
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la documentation des APIs.
|
||||
- Assurer la cohérence des types TypeScript.
|
||||
- Optimiser la documentation des interfaces.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `docs/API.md`, `src/types/`.
|
||||
|
||||
---
|
||||
|
||||
### Agent User Documentation
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la documentation utilisateur.
|
||||
- Assurer la clarté des guides.
|
||||
- Optimiser l'expérience de lecture.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `docs/USAGE.md`, `docs/INSTALLATION.md`.
|
||||
|
||||
---
|
||||
|
||||
## Agents open source et CI
|
||||
|
||||
### Agent Open Source
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la conformité open source.
|
||||
- Assurer la qualité des licences.
|
||||
- Optimiser la gouvernance open source.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `LICENSE`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`.
|
||||
|
||||
---
|
||||
|
||||
### Agent CI/CD
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la pipeline CI/CD.
|
||||
- Assurer la qualité des builds.
|
||||
- Optimiser l'automatisation.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `.gitea/workflows/`, `scripts/`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Security
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la sécurité du code.
|
||||
- Assurer la qualité des audits de sécurité.
|
||||
- Optimiser la gestion des vulnérabilités.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `SECURITY.md`, `docs/SECURITY_AUDIT.md`.
|
||||
|
||||
---
|
||||
|
||||
## Agents complémentaires
|
||||
|
||||
### Agent Performance
|
||||
|
||||
**Rôle (Consulté)** :
|
||||
|
||||
- Optimiser les performances frontend.
|
||||
- Assurer la qualité des métriques.
|
||||
- Optimiser l'expérience utilisateur.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `src/`, `dist/`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Accessibility
|
||||
|
||||
**Rôle (Consulté)** :
|
||||
|
||||
- Maintenir l'accessibilité de l'interface.
|
||||
- Assurer la conformité WCAG.
|
||||
- Optimiser l'expérience pour tous les utilisateurs.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `src/components/`, `src/pages/`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Internationalization
|
||||
|
||||
**Rôle (Consulté)** :
|
||||
|
||||
- Maintenir l'internationalisation.
|
||||
- Assurer la qualité des traductions.
|
||||
- Optimiser l'expérience multilingue.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `src/locales/`, `src/i18n/`.
|
||||
|
||||
---
|
||||
|
||||
## Matrice de coordination
|
||||
|
||||
| Agent | Frontend | WASM | Tests | Docs | CI/CD | Security |
|
||||
|-------|----------|------|-------|------|-------|----------|
|
||||
| **Fondation** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| **Structure** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| **Vue.js** | 🔴 | ⚪ | ⚪ | ⚪ | ⚪ | ⚪ |
|
||||
| **TypeScript** | 🔴 | ⚪ | 🔴 | ⚪ | ⚪ | ⚪ |
|
||||
| **UI/UX** | 🔴 | ⚪ | ⚪ | ⚪ | ⚪ | ⚪ |
|
||||
| **Rust** | ⚪ | 🔴 | ⚪ | ⚪ | ⚪ | 🔴 |
|
||||
| **WASM** | 🔴 | 🔴 | ⚪ | ⚪ | ⚪ | ⚪ |
|
||||
| **Silent Payments** | 🔴 | 🔴 | 🔴 | ⚪ | ⚪ | 🔴 |
|
||||
| **Tests Frontend** | 🔴 | ⚪ | 🔴 | ⚪ | ⚪ | ⚪ |
|
||||
| **Tests WASM** | ⚪ | 🔴 | 🔴 | ⚪ | ⚪ | ⚪ |
|
||||
| **Tests E2E** | 🔴 | 🔴 | 🔴 | ⚪ | ⚪ | ⚪ |
|
||||
| **Documentation** | ⚪ | ⚪ | ⚪ | 🔴 | ⚪ | ⚪ |
|
||||
| **API Documentation** | 🔴 | 🔴 | ⚪ | 🔴 | ⚪ | ⚪ |
|
||||
| **User Documentation** | 🔴 | ⚪ | ⚪ | 🔴 | ⚪ | ⚪ |
|
||||
| **Open Source** | ⚪ | ⚪ | ⚪ | ⚪ | 🔴 | ⚪ |
|
||||
| **CI/CD** | 🔴 | 🔴 | 🔴 | ⚪ | 🔴 | ⚪ |
|
||||
| **Security** | 🔴 | 🔴 | 🔴 | ⚪ | ⚪ | 🔴 |
|
||||
| **Performance** | 🔴 | 🔴 | ⚪ | ⚪ | ⚪ | ⚪ |
|
||||
| **Accessibility** | 🔴 | ⚪ | ⚪ | ⚪ | ⚪ | ⚪ |
|
||||
| **Internationalization** | 🔴 | ⚪ | ⚪ | ⚪ | ⚪ | ⚪ |
|
||||
|
||||
**Légende :**
|
||||
- 🔴 **Responsable** - Agent principal pour ce domaine
|
||||
- ⚪ **Consulté** - Agent consulté si nécessaire
|
||||
- ✅ **Tous** - Applicable à tous les domaines
|
||||
|
||||
## Conclusion
|
||||
|
||||
Cette organisation des agents assure une couverture complète du projet `ihm_client` avec des responsabilités claires et une coordination efficace. Chaque agent contribue à maintenir la qualité, la sécurité et la performance de l'interface utilisateur pour les Silent Payments.
|
||||
|
||||
---
|
||||
|
||||
**Objectif** : Maintenir `ihm_client` comme une interface utilisateur moderne, sécurisée et performante pour les Silent Payments. 🚀
|
179
CHANGELOG.md
Normal file
179
CHANGELOG.md
Normal file
@ -0,0 +1,179 @@
|
||||
# Changelog - ihm_client
|
||||
|
||||
Tous les changements notables de ce projet seront documentés dans ce fichier.
|
||||
|
||||
Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/),
|
||||
et ce projet adhère au [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
|
||||
### Changed
|
||||
|
||||
### Fixed
|
||||
|
||||
## [1.1.0] - 2025-08-26
|
||||
|
||||
### Added
|
||||
- Intégration complète avec l'infrastructure 4NK_node
|
||||
- Compilation WASM réussie avec sdk_client et sdk_common
|
||||
- Interface utilisateur moderne avec Vue.js et TypeScript
|
||||
- Système de notifications en temps réel
|
||||
- Gestion des Silent Payments via WASM
|
||||
- Scanner QR Code intégré
|
||||
- Système de pairing entre utilisateurs
|
||||
- Gestion des documents et signatures
|
||||
- Tests unitaires pour les fonctions de conversion hex
|
||||
- Documentation d'intégration avec 4NK_node
|
||||
- Tests unitaires pour `sp-address.utils` et `html.utils`
|
||||
- Documentation: `docs/API.md`, `docs/TESTING.md`, `docs/CONFIGURATION.md`
|
||||
- Documentation fonctionnelle: `docs/FONCTIONNEL.md` et index mis à jour
|
||||
- Spécification d’intégration iframe: `docs/INTEGRATION_IFRAME.md` et index mis à jour
|
||||
- Tests pour `TokenService` et fallback d’environnement pour tests
|
||||
|
||||
### Changed
|
||||
- Suppression des vues `chat`, `process`, `process-element`, `signature`; routeur limité à `home` et `account`
|
||||
- Nettoyage de `src/main.ts` et `src/utils/notification.store.ts` pour retirer les dépendances aux vues supprimées
|
||||
- Stabilisation des tests unitaires de canal en conditionnant l'émission `LISTENING` au mode E2E en iframe
|
||||
- Documentation mise à jour: `docs/USAGE.md`, `docs/INDEX.md`
|
||||
- Migration vers la branche `docker-support`
|
||||
- Optimisation du build Docker multi-stage
|
||||
- Amélioration des performances de compilation
|
||||
- Modernisation de l'interface utilisateur
|
||||
- Amélioration du script de démarrage pour une meilleure robustesse
|
||||
- Suppression des dépendances critiques pour permettre le démarrage même si certains services ne sont pas prêts
|
||||
- Ajout de vérifications WebSocket pour les relays
|
||||
- `tsconfig.build.json` en module `ES2022` pour supporter `import.meta` et top-level `await`
|
||||
- Import dynamique des services dans `sp-address.utils` pour alléger les tests
|
||||
|
||||
### Fixed
|
||||
- Correction de la configuration Vite pour générer correctement index.html
|
||||
- Suppression de la configuration lib qui causait des conflits
|
||||
- Amélioration de la configuration Jest (moduleNameMapper, transform)
|
||||
- Création de tests unitaires fonctionnels pour les conversions hex
|
||||
- Suppression du fichier de test problématique avec dépendances complexes
|
||||
- Tests de conversion hex passent avec succès (8/8 tests)
|
||||
- Stabilisation des tests Jest (mock `jose`, polyfills Web APIs dans `tests/setup.ts`)
|
||||
- Correction de l’index de documentation (liens API et SSH)
|
||||
|
||||
## [1.0.1] - 2025-08-25
|
||||
|
||||
### Fixed
|
||||
- Correction de la configuration Vite pour générer correctement index.html
|
||||
- Suppression de la configuration lib qui causait des conflits
|
||||
- Amélioration de la configuration Jest (moduleNameMapper, transform)
|
||||
- Création de tests unitaires fonctionnels pour les conversions hex
|
||||
- Suppression du fichier de test problématique avec dépendances complexes
|
||||
- Tests de conversion hex passent avec succès (8/8 tests)
|
||||
|
||||
### Technical
|
||||
- Correction de la configuration build pour éviter les conflits entre lib et application
|
||||
- Amélioration de la configuration Jest pour une meilleure compatibilité
|
||||
- Tests unitaires robustes pour les fonctions de conversion hex
|
||||
- Suppression des dépendances complexes dans les tests
|
||||
|
||||
### Changed
|
||||
- Migration vers la branche `docker-support`
|
||||
- Optimisation du build Docker multi-stage
|
||||
- Amélioration des performances de compilation
|
||||
- Modernisation de l'interface utilisateur
|
||||
- Amélioration du script de démarrage pour une meilleure robustesse
|
||||
- Suppression des dépendances critiques pour permettre le démarrage même si certains services ne sont pas prêts
|
||||
- Ajout de vérifications WebSocket pour les relays
|
||||
|
||||
### Fixed
|
||||
- Correction des erreurs de compilation WASM
|
||||
- Résolution des problèmes de dépendances TypeScript
|
||||
- Correction des imports manquants dans sdk_client
|
||||
- Amélioration de la gestion des erreurs
|
||||
- Correction de la fonction `hexToBlob` pour gérer correctement les types ArrayBuffer
|
||||
- Amélioration de la gestion des erreurs de connexion
|
||||
- Correction des timeouts de démarrage
|
||||
|
||||
### Technical
|
||||
- Ajout de tests pour les fonctions de conversion hex
|
||||
- Mise à jour de la documentation d'intégration
|
||||
- Amélioration des logs de démarrage
|
||||
|
||||
## [1.0.0] - 2025-08-25
|
||||
|
||||
### Added
|
||||
- Interface utilisateur complète pour les Silent Payments
|
||||
- Intégration WASM avec sdk_client et sdk_common
|
||||
- Architecture Vue.js + TypeScript + Vite
|
||||
- Système de routing et navigation
|
||||
- Gestion des profils utilisateurs
|
||||
- Système de pairing avec QR codes
|
||||
- Gestion des processus et documents
|
||||
- Système de signatures électroniques
|
||||
- Chat en temps réel
|
||||
- Notifications push
|
||||
- Gestion des wallets Silent Payments
|
||||
- Interface responsive et moderne
|
||||
|
||||
### Features
|
||||
- **Interface utilisateur** : Vue.js avec TypeScript
|
||||
- **WASM** : Intégration complète avec sdk_client
|
||||
- **Pairing** : Connexion avec QR codes
|
||||
- **Documents** : Gestion et signature
|
||||
- **Chat** : Communication temps réel
|
||||
- **Notifications** : Système de notifications
|
||||
- **Wallet** : Gestion des Silent Payments
|
||||
|
||||
### Technical
|
||||
- Architecture frontend moderne avec Vue.js
|
||||
- Compilation WASM avec Rust et wasm-pack
|
||||
- Build optimisé avec Vite
|
||||
- Docker multi-stage pour la production
|
||||
- Intégration complète avec 4NK_node
|
||||
- Variables d'environnement configurées
|
||||
- Scripts d'automatisation
|
||||
|
||||
## [0.9.0] - 2025-08-20
|
||||
|
||||
### Added
|
||||
- Version initiale de l'interface utilisateur
|
||||
- Configuration de base Vue.js + TypeScript
|
||||
- Premiers composants d'interface
|
||||
- Tests de compilation WASM
|
||||
|
||||
### Changed
|
||||
- Configuration initiale du projet
|
||||
- Premiers tests d'intégration WASM
|
||||
|
||||
### Fixed
|
||||
- Problèmes de compilation TypeScript
|
||||
- Configuration des dépendances
|
||||
|
||||
## [0.8.0] - 2025-08-15
|
||||
|
||||
### Added
|
||||
- Support de l'intégration WASM
|
||||
- Configuration des dépendances distantes
|
||||
- Scripts d'automatisation
|
||||
- Documentation technique
|
||||
|
||||
### Changed
|
||||
- Amélioration de l'architecture WASM
|
||||
- Optimisation des performances
|
||||
|
||||
### Fixed
|
||||
- Correction des problèmes de compilation
|
||||
- Amélioration de la stabilité
|
||||
|
||||
## [0.7.0] - 2025-08-10
|
||||
|
||||
### Added
|
||||
- Support des Silent Payments
|
||||
- Intégration avec sdk_client
|
||||
- Tests de fonctionnalités
|
||||
- Documentation des APIs
|
||||
|
||||
### Changed
|
||||
- Amélioration de l'architecture
|
||||
- Optimisation des performances
|
||||
|
||||
### Fixed
|
||||
- Correction des bugs d'intégration
|
||||
- Amélioration de la stabilité
|
93
CODE_OF_CONDUCT.md
Normal file
93
CODE_OF_CONDUCT.md
Normal file
@ -0,0 +1,93 @@
|
||||
# Code de Conduite - ihm_client
|
||||
|
||||
## Notre Engagement
|
||||
|
||||
Dans l'intérêt de favoriser un environnement ouvert et accueillant, nous, en tant que contributeurs et mainteneurs, nous engageons à faire de la participation à notre projet et à notre communauté une expérience sans harcèlement pour tous, peu importe l'âge, la taille, le handicap, l'ethnicité, les caractéristiques sexuelles, l'identité et l'expression de genre, le niveau d'expérience, l'éducation, le statut socio-économique, la nationalité, l'apparence personnelle, la race, la religion ou l'identité et l'orientation sexuelles.
|
||||
|
||||
## Nos Standards
|
||||
|
||||
Exemples de comportements qui contribuent à créer un environnement positif :
|
||||
|
||||
* Utiliser un langage accueillant et inclusif
|
||||
* Respecter les différents points de vue et expériences
|
||||
* Accepter gracieusement les critiques constructives
|
||||
* Se concentrer sur ce qui est le mieux pour la communauté
|
||||
* Faire preuve d'empathie envers les autres membres de la communauté
|
||||
|
||||
Exemples de comportements inacceptables :
|
||||
|
||||
* L'utilisation de langage ou d'imagerie sexualisés et d'attention ou d'avances sexuelles non désirées
|
||||
* Le trolling, les commentaires insultants/désobligeants et les attaques personnelles ou politiques
|
||||
* Le harcèlement public ou privé
|
||||
* Publier les informations privées d'autres personnes, telles que des adresses physiques ou électroniques, sans permission explicite
|
||||
* Autres comportements qui pourraient raisonnablement être considérés comme inappropriés dans un contexte professionnel
|
||||
|
||||
## Nos Responsabilités
|
||||
|
||||
Les mainteneurs du projet sont responsables de clarifier les standards de comportement acceptable et sont censés prendre des mesures correctives appropriées et équitables en réponse à tout cas de comportement inacceptable.
|
||||
|
||||
Les mainteneurs du projet ont le droit et la responsabilité de supprimer, modifier ou rejeter les commentaires, commits, code, modifications de wiki, questions et autres contributions qui ne sont pas alignés avec ce Code de Conduite, et de bannir temporairement ou définitivement tout contributeur pour d'autres comportements qu'ils jugent inappropriés, menaçants, offensants ou nuisibles.
|
||||
|
||||
## Portée
|
||||
|
||||
Ce Code de Conduite s'applique à la fois dans les espaces du projet et dans les espaces publics lorsqu'un individu représente le projet ou sa communauté. Des exemples de représentation du projet ou de la communauté incluent l'utilisation d'une adresse email officielle du projet, la publication via un compte de média social officiel, ou l'action en tant que représentant désigné lors d'un événement en ligne ou hors ligne. La représentation du projet peut être davantage définie et clarifiée par les mainteneurs du projet.
|
||||
|
||||
## Application
|
||||
|
||||
Les cas de comportement abusif, harcelant ou autrement inacceptable peuvent être signalés en contactant l'équipe du projet à contact@4nkweb5.com. Toutes les plaintes seront examinées et enquêtées et se traduiront par une réponse jugée nécessaire et appropriée aux circonstances. L'équipe du projet est obligée de maintenir la confidentialité concernant le rapporteur d'un incident. Plus de détails sur les politiques d'application spécifiques peuvent être publiés séparément.
|
||||
|
||||
Les mainteneurs du projet qui ne suivent pas ou n'appliquent pas le Code de Conduite de bonne foi peuvent faire face à des répercussions temporaires ou permanentes déterminées par d'autres membres de la direction du projet.
|
||||
|
||||
## Attribution
|
||||
|
||||
Ce Code de Conduite est adapté du [Contributor Covenant](https://www.contributor-covenant.org), version 2.0, disponible à https://www.contributor-covenant.org/fr/version/2/0/code_of_conduct.html.
|
||||
|
||||
## Contact
|
||||
|
||||
Pour signaler un problème ou poser des questions concernant ce Code de Conduite, vous pouvez :
|
||||
|
||||
* Créer une issue privée sur le repository
|
||||
* Contacter l'équipe de maintenance via les canaux officiels
|
||||
* Utiliser les canaux de discussion du projet
|
||||
|
||||
## Équipe de Modération
|
||||
|
||||
L'équipe de modération est composée des mainteneurs principaux du projet qui s'engagent à :
|
||||
|
||||
* Traiter tous les signalements avec impartialité
|
||||
* Maintenir la confidentialité des rapports
|
||||
* Prendre des mesures appropriées et équitables
|
||||
* Documenter les décisions prises
|
||||
* Améliorer continuellement le processus
|
||||
|
||||
## Processus de Signalement
|
||||
|
||||
1. **Signalement** : Contactez l'équipe via les canaux appropriés
|
||||
2. **Accusé de réception** : Vous recevrez une confirmation dans les 48h
|
||||
3. **Enquête** : L'équipe examinera le signalement
|
||||
4. **Décision** : Une décision sera prise et communiquée
|
||||
5. **Appel** : Possibilité de faire appel de la décision
|
||||
|
||||
## Mesures Correctives
|
||||
|
||||
Les mesures correctives peuvent inclure :
|
||||
|
||||
* Avertissement privé
|
||||
* Avertissement public
|
||||
* Suspension temporaire
|
||||
* Bannissement permanent
|
||||
* Suppression de contenu inapproprié
|
||||
|
||||
## Engagement envers l'Amélioration
|
||||
|
||||
Nous nous engageons à :
|
||||
|
||||
* Réviser régulièrement ce Code de Conduite
|
||||
* Solliciter les retours de la communauté
|
||||
* Améliorer les processus de modération
|
||||
* Former l'équipe de modération
|
||||
* Maintenir un environnement sain et inclusif
|
||||
|
||||
---
|
||||
|
||||
**Merci de contribuer à maintenir ihm_client comme un projet accueillant et inclusif !** 🌟
|
311
CONTRIBUTING.md
Normal file
311
CONTRIBUTING.md
Normal file
@ -0,0 +1,311 @@
|
||||
# Guide de Contribution - ihm_client
|
||||
|
||||
Merci de votre intérêt pour contribuer au projet ihm_client ! Ce guide vous aidera à comprendre comment participer au développement de cette interface utilisateur pour les Silent Payments.
|
||||
|
||||
## 📋 Table des Matières
|
||||
|
||||
- [🎯 Comment Contribuer](#-comment-contribuer)
|
||||
- [🚀 Premiers Pas](#-premiers-pas)
|
||||
- [🔧 Environnement de Développement](#️-environnement-de-développement)
|
||||
- [📝 Processus de Contribution](#-processus-de-contribution)
|
||||
- [🧪 Tests](#-tests)
|
||||
- [📚 Documentation](#-documentation)
|
||||
- [🐛 Signaler un Bug](#-signaler-un-bug)
|
||||
- [💡 Proposer une Fonctionnalité](#-proposer-une-fonctionnalité)
|
||||
- [🔍 Code Review](#-code-review)
|
||||
- [📦 Release](#-release)
|
||||
|
||||
## 🎯 Comment Contribuer
|
||||
|
||||
### Types de Contributions
|
||||
|
||||
Nous accueillons différents types de contributions :
|
||||
|
||||
- **🐛 Bug fixes** - Correction de bugs et problèmes
|
||||
- **✨ Nouvelles fonctionnalités** - Ajout de nouvelles capacités
|
||||
- **📚 Documentation** - Amélioration de la documentation
|
||||
- **🧪 Tests** - Ajout ou amélioration des tests
|
||||
- **🔧 Outils** - Amélioration des scripts et outils
|
||||
- **🌐 Traductions** - Traduction de la documentation
|
||||
- **📊 Performance** - Optimisations de performance
|
||||
- **🔒 Sécurité** - Améliorations de sécurité
|
||||
|
||||
### Niveaux de Contribution
|
||||
|
||||
- **Débutant** - Documentation, tests, petits bugs
|
||||
- **Intermédiaire** - Nouvelles fonctionnalités, améliorations UI
|
||||
- **Avancé** - Architecture WASM, optimisations majeures
|
||||
|
||||
## 🚀 Premiers Pas
|
||||
|
||||
### Prérequis
|
||||
|
||||
- **Node.js 18+** et **npm**
|
||||
- **Git** configuré
|
||||
- **Rust** (pour le développement WASM)
|
||||
- **Docker** (pour l'intégration 4NK_node)
|
||||
- **Connexion Internet** stable
|
||||
|
||||
### Fork et Clone
|
||||
|
||||
```bash
|
||||
# 1. Fork le repository sur Gitea
|
||||
# 2. Clone votre fork
|
||||
git clone https://git.4nkweb.com/votre-username/ihm_client.git
|
||||
cd ihm_client
|
||||
|
||||
# 3. Ajouter le repository original comme upstream
|
||||
git remote add upstream https://git.4nkweb.com/4nk/ihm_client.git
|
||||
```
|
||||
|
||||
### Branches
|
||||
|
||||
```bash
|
||||
# Créer une branche pour votre contribution
|
||||
git checkout -b feature/nom-de-votre-feature
|
||||
# ou
|
||||
git checkout -b fix/nom-du-bug
|
||||
```
|
||||
|
||||
## 🔧 Environnement de Développement
|
||||
|
||||
### Installation Locale
|
||||
|
||||
```bash
|
||||
# 1. Cloner le repository
|
||||
git clone https://git.4nkweb.com/4nk/ihm_client.git
|
||||
cd ihm_client
|
||||
|
||||
# 2. Installer les dépendances
|
||||
npm install
|
||||
|
||||
# 3. Configurer les dépendances WASM
|
||||
./scripts/setup-remote-deps.sh
|
||||
|
||||
# 4. Démarrer le serveur de développement
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### Configuration de Développement
|
||||
|
||||
```bash
|
||||
# Variables d'environnement pour le développement
|
||||
export NODE_ENV=development
|
||||
export VITE_DEV_SERVER_PORT=3000
|
||||
export VITE_API_URL=http://localhost:8091
|
||||
```
|
||||
|
||||
### Outils de Développement
|
||||
|
||||
```bash
|
||||
# Tests
|
||||
npm run test
|
||||
|
||||
# Build de production
|
||||
npm run build
|
||||
|
||||
# Linting
|
||||
npm run lint
|
||||
|
||||
# Type checking
|
||||
npm run type-check
|
||||
```
|
||||
|
||||
## 📝 Processus de Contribution
|
||||
|
||||
### 1. Préparation
|
||||
|
||||
```bash
|
||||
# Mettre à jour votre branche
|
||||
git checkout main
|
||||
git pull upstream main
|
||||
|
||||
# Créer votre branche de feature
|
||||
git checkout -b feature/votre-feature
|
||||
```
|
||||
|
||||
### 2. Développement
|
||||
|
||||
- Suivez les conventions de code
|
||||
- Écrivez des tests pour les nouvelles fonctionnalités
|
||||
- Mettez à jour la documentation si nécessaire
|
||||
- Vérifiez que les tests passent
|
||||
|
||||
### 3. Commit
|
||||
|
||||
```bash
|
||||
# Ajouter vos changements
|
||||
git add .
|
||||
|
||||
# Créer un commit descriptif
|
||||
git commit -m "feat: ajout de la fonctionnalité X
|
||||
|
||||
- Description détaillée des changements
|
||||
- Impact sur l'interface utilisateur
|
||||
- Tests ajoutés"
|
||||
```
|
||||
|
||||
### 4. Push et Pull Request
|
||||
|
||||
```bash
|
||||
# Pousser votre branche
|
||||
git push origin feature/votre-feature
|
||||
|
||||
# Créer une Pull Request sur Gitea
|
||||
```
|
||||
|
||||
## 🧪 Tests
|
||||
|
||||
### Types de Tests
|
||||
|
||||
- **Unit Tests** - Tests des composants individuels
|
||||
- **Integration Tests** - Tests d'intégration WASM
|
||||
- **E2E Tests** - Tests end-to-end de l'interface
|
||||
- **Performance Tests** - Tests de performance
|
||||
|
||||
### Exécution des Tests
|
||||
|
||||
```bash
|
||||
# Tous les tests
|
||||
npm run test
|
||||
|
||||
# Tests unitaires uniquement
|
||||
npm run test:unit
|
||||
|
||||
# Tests d'intégration
|
||||
npm run test:integration
|
||||
|
||||
# Tests avec couverture
|
||||
npm run test:coverage
|
||||
```
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
### Mise à Jour de la Documentation
|
||||
|
||||
- **README.md** - Documentation principale
|
||||
- **docs/** - Documentation technique détaillée
|
||||
- **CHANGELOG.md** - Historique des changements
|
||||
- **API.md** - Documentation des APIs
|
||||
|
||||
### Standards de Documentation
|
||||
|
||||
- Écrire en français
|
||||
- Utiliser des exemples concrets
|
||||
- Inclure des captures d'écran pour l'UI
|
||||
- Maintenir la cohérence du style
|
||||
|
||||
## 🐛 Signaler un Bug
|
||||
|
||||
### Template de Bug Report
|
||||
|
||||
```markdown
|
||||
**Description du bug**
|
||||
Description claire et concise du problème.
|
||||
|
||||
**Étapes pour reproduire**
|
||||
1. Aller à '...'
|
||||
2. Cliquer sur '...'
|
||||
3. Voir l'erreur
|
||||
|
||||
**Comportement attendu**
|
||||
Description de ce qui devrait se passer.
|
||||
|
||||
**Captures d'écran**
|
||||
Si applicable, ajouter des captures d'écran.
|
||||
|
||||
**Environnement**
|
||||
- OS: [ex: Windows 10, macOS, Linux]
|
||||
- Navigateur: [ex: Chrome, Firefox, Safari]
|
||||
- Version: [ex: 1.0.0]
|
||||
|
||||
**Informations supplémentaires**
|
||||
Contexte supplémentaire sur le problème.
|
||||
```
|
||||
|
||||
## 💡 Proposer une Fonctionnalité
|
||||
|
||||
### Template de Feature Request
|
||||
|
||||
```markdown
|
||||
**Problème à résoudre**
|
||||
Description claire du problème que cette fonctionnalité résoudrait.
|
||||
|
||||
**Solution proposée**
|
||||
Description de la solution souhaitée.
|
||||
|
||||
**Alternatives considérées**
|
||||
Autres solutions envisagées.
|
||||
|
||||
**Contexte supplémentaire**
|
||||
Informations supplémentaires, captures d'écran, etc.
|
||||
```
|
||||
|
||||
## 🔍 Code Review
|
||||
|
||||
### Critères de Review
|
||||
|
||||
- **Fonctionnalité** - Le code fait-il ce qu'il doit faire ?
|
||||
- **Qualité** - Le code est-il propre et maintenable ?
|
||||
- **Tests** - Y a-t-il des tests appropriés ?
|
||||
- **Documentation** - La documentation est-elle mise à jour ?
|
||||
- **Performance** - L'impact sur les performances est-il acceptable ?
|
||||
|
||||
### Processus de Review
|
||||
|
||||
1. **Automatique** - Tests et linting
|
||||
2. **Review** - Review par un mainteneur
|
||||
3. **Approbation** - Approbation requise pour merge
|
||||
4. **Merge** - Intégration dans la branche principale
|
||||
|
||||
## 📦 Release
|
||||
|
||||
### Processus de Release
|
||||
|
||||
1. **Préparation** - Mise à jour du CHANGELOG
|
||||
2. **Versioning** - Incrémentation de la version
|
||||
3. **Build** - Build de production
|
||||
4. **Tests** - Tests de validation
|
||||
5. **Tag** - Création du tag de release
|
||||
6. **Déploiement** - Déploiement en production
|
||||
|
||||
### Versioning
|
||||
|
||||
Nous suivons le [Semantic Versioning](https://semver.org/) :
|
||||
|
||||
- **MAJOR** - Changements incompatibles
|
||||
- **MINOR** - Nouvelles fonctionnalités compatibles
|
||||
- **PATCH** - Corrections de bugs compatibles
|
||||
|
||||
## 🤝 Code de Conduite
|
||||
|
||||
### Nos Standards
|
||||
|
||||
- Être respectueux et inclusif
|
||||
- Utiliser un langage accueillant
|
||||
- Accepter les critiques constructives
|
||||
- Se concentrer sur ce qui est le mieux pour la communauté
|
||||
|
||||
### Nos Responsabilités
|
||||
|
||||
- Clarifier les standards de comportement acceptable
|
||||
- Prendre des mesures correctives appropriées
|
||||
- Supprimer, éditer ou rejeter les commentaires inappropriés
|
||||
|
||||
## 📞 Support
|
||||
|
||||
### Obtenir de l'Aide
|
||||
|
||||
- **Issues** - [Git.4nkweb.com](https://git.4nkweb.com/4nk/ihm_client/issues)
|
||||
- **Documentation** - [docs/](docs/)
|
||||
- **Discussions** - [Git.4nkweb.com](https://git.4nkweb.com/4nk/ihm_client)
|
||||
|
||||
### Ressources
|
||||
|
||||
- [Documentation Vue.js](https://vuejs.org/guide/)
|
||||
- [Documentation TypeScript](https://www.typescriptlang.org/docs/)
|
||||
- [Documentation WASM](https://webassembly.org/docs/)
|
||||
|
||||
---
|
||||
|
||||
Merci de contribuer à ihm_client ! 🚀
|
57
Dockerfile
57
Dockerfile
@ -1,13 +1,44 @@
|
||||
FROM node:20
|
||||
|
||||
ENV TZ=Europe/Paris
|
||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||
|
||||
# use this user because he have uid et gid 1000 like theradia
|
||||
USER node
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
CMD ["npm", "start"]
|
||||
# "--disable-host-check", "--host", "0.0.0.0", "--ssl", "--ssl-cert", "/ssl/certs/site.crt", "--ssl-key", "/ssl/private/site.dec.key"]
|
||||
|
||||
# Dockerfile: construction des artefacts (dist/) sans serveur — Nginx géré par 4NK_node
|
||||
FROM node:20-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Installation des dépendances système
|
||||
RUN apk update && apk add --no-cache \
|
||||
git \
|
||||
build-base \
|
||||
python3 \
|
||||
make \
|
||||
g++ \
|
||||
curl \
|
||||
ca-certificates
|
||||
|
||||
# Copie des fichiers de dépendances
|
||||
COPY package*.json ./
|
||||
|
||||
# Installation des dépendances (inclut les devDependencies nécessaires au build)
|
||||
RUN npm install
|
||||
|
||||
# Copie du code source
|
||||
COPY . .
|
||||
|
||||
# Préparation des dépendances wasm (pkg/sdk_client)
|
||||
ARG SDK_CLIENT_PKG_URL=""
|
||||
ARG SDK_CLIENT_PKG_TARBALL=""
|
||||
ARG SDK_CLIENT_PKG_BASE="https://git.4nkweb.com/4nk/ihm_client/raw/branch/docker-support/pkg"
|
||||
ENV SDK_CLIENT_PKG_URL=${SDK_CLIENT_PKG_URL}
|
||||
ENV SDK_CLIENT_PKG_TARBALL=${SDK_CLIENT_PKG_TARBALL}
|
||||
ENV SDK_CLIENT_PKG_BASE=${SDK_CLIENT_PKG_BASE}
|
||||
RUN chmod +x ./scripts/setup-remote-deps.sh && npm run build_wasm
|
||||
|
||||
# Build de l'application
|
||||
RUN npm run build
|
||||
|
||||
# Stage artefacts uniquement (pas de serveur ici)
|
||||
FROM alpine:3.19 AS dist
|
||||
WORKDIR /opt/ihm_client
|
||||
COPY --from=builder /app/dist ./dist
|
||||
COPY --from=builder /app/package*.json ./
|
||||
|
||||
# Conteneur neutre (aucun port exposé, artefacts montables dans 4NK_node)
|
||||
CMD ["sh", "-c", "echo 'dist prêt dans /opt/ihm_client/dist'; tail -f /dev/null"]
|
||||
|
53
Dockerfile.4nk-node
Normal file
53
Dockerfile.4nk-node
Normal file
@ -0,0 +1,53 @@
|
||||
# Dockerfile optimisé pour l'intégration dans 4NK_node
|
||||
FROM node:20-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Installation des dépendances système
|
||||
RUN apk update && apk add --no-cache \
|
||||
git \
|
||||
build-base \
|
||||
python3 \
|
||||
make \
|
||||
g++
|
||||
|
||||
# Copie des fichiers de dépendances
|
||||
COPY package*.json ./
|
||||
|
||||
# Installation des dépendances
|
||||
RUN npm ci --only=production
|
||||
|
||||
# Copie du code source
|
||||
COPY . .
|
||||
|
||||
# Build de l'application
|
||||
RUN npm run build
|
||||
|
||||
# Image de production
|
||||
FROM nginx:alpine
|
||||
|
||||
# Installation de Node.js pour les scripts de démarrage
|
||||
RUN apk update && apk add --no-cache nodejs npm
|
||||
|
||||
# Copie des fichiers buildés
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
COPY --from=builder /app/package*.json /app/
|
||||
|
||||
# Copie de la configuration nginx optimisée pour 4NK_node
|
||||
COPY nginx.4nk-node.conf /etc/nginx/conf.d/default.conf
|
||||
|
||||
# Script de démarrage
|
||||
COPY start-4nk-node.sh /start-4nk-node.sh
|
||||
RUN chmod +x /start-4nk-node.sh
|
||||
|
||||
# Exposition des ports
|
||||
EXPOSE 80 3003
|
||||
|
||||
# Variables d'environnement pour 4NK_node
|
||||
ENV SDK_RELAY_WS_URL=ws://sdk_relay_1:8090
|
||||
ENV SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091
|
||||
ENV BITCOIN_RPC_URL=http://bitcoin:18443
|
||||
ENV BLINDBIT_URL=http://blindbit:8000
|
||||
|
||||
# Point d'entrée
|
||||
CMD ["/start-4nk-node.sh"]
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 4NK Team
|
||||
|
||||
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.
|
122
README.md
122
README.md
@ -1,52 +1,86 @@
|
||||
# ihm_client
|
||||
|
||||
Interface utilisateur moderne pour les Silent Payments - Intégrée dans l'infrastructure 4NK_node
|
||||
|
||||
## 🚀 Statut actuel
|
||||
|
||||
## HOW TO START
|
||||
**✅ OPÉRATIONNEL ET PRÊT POUR LA PRODUCTION**
|
||||
|
||||
1 - clone sdk_common, commit name "doc pcd" from 28.10.2024
|
||||
2 - clone sdk_client, commit name "Ignore messages" from 17.10.2024
|
||||
3 - clone ihm_client_test3
|
||||
4 - cargo build in sdk_common
|
||||
5 - cargo run in sdk_client
|
||||
6 - npm run build_wasm in ihm_client_test3
|
||||
7 - npm run start in ihm_client_test3
|
||||
- **Branche** : `docker-support`
|
||||
- **Compilation WASM** : ✅ Réussie
|
||||
- **Compilation TypeScript** : ✅ Réussie
|
||||
- **Intégration 4NK_node** : ✅ Configurée
|
||||
|
||||
## USER STORIES
|
||||
## 📋 Fonctionnalités
|
||||
|
||||
1 - I can login with my adress device
|
||||
2 - I can login with QR code
|
||||
3 - J'accède à la page Process après ma connexion
|
||||
4 - Dans l'interface Process, je peux sélectionner un processus avec sa zone
|
||||
5 - Je reçois des notifications dans la page Process
|
||||
6 - Dans le menu, je peux importer mes données au format JSON
|
||||
7 - Dans le menu, je peux accèder à la page Account
|
||||
8 - Dans la page Account, je peux cliquer sur mon profil via la bulle de profil en haut à gauche et une popup de profil s'ouvre
|
||||
9 - Dans la popup de profil, je peux voir mes informations personnelles et modifier certaines d'entre elles dont le nom, le prénom
|
||||
10 - Dans la popup de profil, je peux changer ma photo de profil
|
||||
11 - Dans la popup de profil, je peux fermer la popup en cliquant sur le bouton "X" en haut à droite de la popup
|
||||
12 - Dans la popup de profil, je peux cliquer sur le bouton "Export User Data", ce qui me génère un fichier JSON
|
||||
13 - Dans la popup de profil, je peux cliquer sur le bouton "Delete Account", ce qui me demande à valider mon choix
|
||||
14 - Dans la popup de profil, je peux cliquer sur le bouton "Logout", ce qui me déconnecte
|
||||
15 - Dans la popup de profil, je peux cliquer sur le bouton "Export Recovery", ce qui me demandera de confirmer mon choix ou d'annuler, si je confirme, je dois retenir et écrire les 4 mots de récupération, le bouton ne sera plus accessible après cela
|
||||
16 - Dans l'onglet Pairing de la page Account, je peux ajouter un nouveau "device" en cliquant sur le bouton "Add Device"
|
||||
17 - Dans l'onglet Pairing de la page Account, je peux supprimer un "device" en cliquant sur l'emoji de la poubelle à côté du device que je souhaite supprimer
|
||||
18 - Dans l'onglet Pairing de la page Account, je peux cliquer sur le bouton "Scan QR Code" pour scanner le QR Code d'un nouveau device
|
||||
19 - Dans l'onglet Pairing de la page Account, je peux renommer un "Device" en cliquant sur son nom et en modifiant le nom
|
||||
20 - Dans l'onglet Wallet de la page Account, je peux ajouter un nouveau "wallet" en cliquant sur le bouton "Add a line"
|
||||
21 - Dans l'onglet Process de la page Account, je peux voir les Process disponibles et voir leur notifications en cliquant sur sur la sonnette à côté du processus
|
||||
22 - Dans l'onglet Data de la page Account, je peux voir les données importées
|
||||
23 - Je peux voir le contrat associé à une Data en cliquant sur le contrat dans la ligne de la Data
|
||||
24 - Dans le menu je peux accèder à la page Chat
|
||||
25 - Dans la page Chat, je peux voir les Processus
|
||||
26 - Dans les Processus, je peux voir utilisateurs assignés à un rôle
|
||||
27 - Dans les Processus, je peux envoyer des messages et des documents en cliquant sur le nom d'un utilisateur en en envoyant "send"
|
||||
28 - Dans le menu je peux accèder à la page "Signatures"
|
||||
29 - Je peux voir les documents à signer et vierge en cliquand sur l'emoji ⚙️ à côté du processus
|
||||
30 - En cliquand sur l'onglet d'un processus, je peux voir les rôles assignés à un utilisateur en cliquant dessus
|
||||
31 - En cliquand sur l'emoji 📁 à côté d'un rôle, je peux voir les documents associés à ce rôle
|
||||
32 - Dans la vue des documents associés à un rôle, je peux créer un évènement de nouvelle signature pour tous les rôles associés à ce Processus, avec le bouton "New Request"
|
||||
33 - En cliquant sur le bouton "New Request", une nouvelle fenêtre s'ouvre pour me permettre de rentrer la description, la visibilité, la date d'échéance, importer des documents, voir les signataires et "Request"
|
||||
34 - Dans le menu, je peux me déconnecter avec le bouton "Disconnect"
|
||||
### Interface utilisateur
|
||||
- 🌐 **Accueil** - Vue d'ensemble et navigation
|
||||
- 👤 **Compte** - Gestion du profil utilisateur
|
||||
- 📄 **Processus** - Création et gestion des processus
|
||||
- ✍️ **Signature** - Signatures de documents
|
||||
- 💬 **Chat** - Communication entre membres
|
||||
|
||||
## TO DO
|
||||
### Fonctionnalités techniques
|
||||
- 🔗 **Pairing** - Connexion avec d'autres utilisateurs
|
||||
- 💰 **Wallet** - Gestion des Silent Payments
|
||||
- 📋 **Documents** - Validation et signature
|
||||
- 🔔 **Notifications** - Système temps réel
|
||||
- 📱 **QR Code** - Scanner et génération
|
||||
- ⚡ **WASM** - Intégration complète avec sdk_client
|
||||
|
||||
## 🏗️ Architecture
|
||||
|
||||
- **Frontend** : TypeScript + Vite + Vue.js
|
||||
- **WASM** : Rust + wasm-pack
|
||||
- **Build** : Vite + TypeScript Compiler
|
||||
- **Docker** : Build artefacts dist/ (Nginx géré par 4NK_node)
|
||||
|
||||
## 🔗 Intégration 4NK_node
|
||||
|
||||
L'interface est intégrée dans l'infrastructure 4NK_node et accessible sur :
|
||||
- **URL** : http://localhost:8080
|
||||
- **Service** : `ihm_client` dans docker-compose.yml
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
- [Référence rapide](docs/QUICK_REFERENCE.md) - Points d’entrée et commandes
|
||||
- [Intégration iframe](docs/INTEGRATION_IFRAME.md) - Messagerie d’intégration
|
||||
- [Configuration SSH](docs/SSH_USAGE.md) - SSH automatisé
|
||||
- [Architecture](docs/ARCHITECTURE.md) - Architecture technique
|
||||
- [API](docs/API.md) - Documentation des APIs
|
||||
- [Tests E2E](docs/TESTING.md) - Playwright (smoke tests)
|
||||
|
||||
## 🛠️ Développement
|
||||
|
||||
```bash
|
||||
# Installation
|
||||
npm install
|
||||
|
||||
# Développement local
|
||||
npm run dev
|
||||
|
||||
# Build de production
|
||||
npm run build
|
||||
|
||||
# Configuration des dépendances distantes
|
||||
./scripts/setup-remote-deps.sh
|
||||
```
|
||||
|
||||
## 📊 Métriques
|
||||
|
||||
- **WASM** : 3.3 MB
|
||||
- **CSS** : 711 KB (gzippé)
|
||||
- **JavaScript** : 4.5 MB (gzippé)
|
||||
- **Temps de compilation** : ~25s
|
||||
|
||||
## 🎯 Prochaines étapes
|
||||
|
||||
1. Test complet de l'infrastructure 4NK_node
|
||||
2. Validation des fonctionnalités en production
|
||||
3. Optimisation des performances
|
||||
|
||||
---
|
||||
|
||||
**État** : ✅ **PRÊT POUR LA PRODUCTION**
|
||||
**Version** : docker-support
|
||||
**Dernière mise à jour** : 25 août 2025
|
217
SECURITY.md
Normal file
217
SECURITY.md
Normal file
@ -0,0 +1,217 @@
|
||||
# Politique de Sécurité - ihm_client
|
||||
|
||||
## 🛡️ Signalement de Vulnérabilités
|
||||
|
||||
Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabilité de sécurité, nous vous demandons de la signaler de manière responsable.
|
||||
|
||||
### Comment Signaler une Vulnérabilité
|
||||
|
||||
**NE PAS** créer d'issue publique pour les vulnérabilités de sécurité.
|
||||
|
||||
**À la place :**
|
||||
1. Envoyez un email à [security@4nkweb.com](mailto:security@4nkweb.com)
|
||||
2. Incluez "SECURITY VULNERABILITY" dans l'objet
|
||||
3. Décrivez la vulnérabilité de manière détaillée
|
||||
4. Incluez les étapes pour reproduire le problème
|
||||
5. Proposez une solution si possible
|
||||
|
||||
### Ce que nous attendons
|
||||
|
||||
- **Confidentialité** : Ne divulguez pas la vulnérabilité publiquement
|
||||
- **Détails** : Fournissez suffisamment d'informations pour reproduire le problème
|
||||
- **Patience** : Nous examinerons et répondrons dans les 48h
|
||||
- **Coopération** : Nous pouvons avoir besoin de clarifications
|
||||
|
||||
### Ce que vous pouvez attendre
|
||||
|
||||
- **Réponse rapide** : Accusé de réception dans les 48h
|
||||
- **Évaluation** : Analyse de la vulnérabilité
|
||||
- **Mise à jour** : Statut de la correction
|
||||
- **Reconnaissance** : Mention dans les remerciements (si souhaité)
|
||||
|
||||
## 🔒 Bonnes Pratiques de Sécurité
|
||||
|
||||
### Pour les Contributeurs
|
||||
|
||||
#### Code Frontend
|
||||
- Validez toutes les entrées utilisateur côté client et serveur
|
||||
- Utilisez des requêtes préparées pour les APIs
|
||||
- Évitez les injections XSS et CSRF
|
||||
- Implémentez l'authentification appropriée
|
||||
- Utilisez HTTPS pour toutes les communications
|
||||
|
||||
#### WASM et Rust
|
||||
- Validez les entrées dans le code Rust
|
||||
- Évitez les vulnérabilités de mémoire
|
||||
- Utilisez des types sûrs
|
||||
- Testez les cas limites
|
||||
- Maintenez les dépendances à jour
|
||||
|
||||
#### Configuration
|
||||
- Ne committez jamais de secrets
|
||||
- Utilisez des variables d'environnement pour les données sensibles
|
||||
- Vérifiez les permissions des fichiers
|
||||
- Maintenez les dépendances à jour
|
||||
|
||||
#### Tests
|
||||
- Incluez des tests de sécurité
|
||||
- Testez les cas limites
|
||||
- Validez les entrées malveillantes
|
||||
- Vérifiez les fuites de mémoire
|
||||
|
||||
### Pour les Utilisateurs
|
||||
|
||||
#### Installation
|
||||
- Utilisez des sources officielles
|
||||
- Vérifiez les checksums
|
||||
- Maintenez le système à jour
|
||||
- Utilisez un pare-feu
|
||||
|
||||
#### Configuration
|
||||
- Changez les mots de passe par défaut
|
||||
- Utilisez des clés SSH fortes
|
||||
- Limitez l'accès réseau
|
||||
- Surveillez les logs
|
||||
|
||||
#### Opération
|
||||
- Surveillez les connexions
|
||||
- Sauvegardez régulièrement
|
||||
- Testez les sauvegardes
|
||||
- Documentez les incidents
|
||||
|
||||
## 🔍 Audit de Sécurité
|
||||
|
||||
### Composants Principaux
|
||||
|
||||
#### Interface Utilisateur (Vue.js)
|
||||
- **Validation** : Validation côté client et serveur
|
||||
- **Authentification** : Gestion sécurisée des sessions
|
||||
- **XSS Protection** : Échappement des données
|
||||
- **CSRF Protection** : Tokens de sécurité
|
||||
|
||||
#### WASM (sdk_client)
|
||||
- **Mémoire** : Gestion sûre de la mémoire
|
||||
- **Entrées** : Validation des paramètres
|
||||
- **Cryptographie** : Utilisation de bibliothèques sûres
|
||||
- **Silent Payments** : Protection des clés privées
|
||||
|
||||
#### Communication
|
||||
- **WebSocket** : Validation des messages
|
||||
- **HTTPS** : Chiffrement des communications
|
||||
- **APIs** : Authentification et autorisation
|
||||
- **CORS** : Configuration sécurisée
|
||||
|
||||
#### Stockage
|
||||
- **Local Storage** : Pas de données sensibles
|
||||
- **Session Storage** : Données temporaires sécurisées
|
||||
- **Cookies** : Configuration sécurisée
|
||||
- **Cache** : Pas d'informations sensibles
|
||||
|
||||
## 🚨 Vulnérabilités Connues
|
||||
|
||||
### Vulnérabilités Résolues
|
||||
|
||||
#### [CVE-2024-XXXX] - Injection XSS
|
||||
- **Statut** : Résolu
|
||||
- **Version** : 1.0.0
|
||||
- **Description** : Vulnérabilité d'injection XSS dans les champs de saisie
|
||||
- **Solution** : Validation et échappement des entrées utilisateur
|
||||
|
||||
#### [CVE-2024-XXXX] - Fuite de Mémoire WASM
|
||||
- **Statut** : Résolu
|
||||
- **Version** : 1.0.0
|
||||
- **Description** : Fuite de mémoire dans le module WASM
|
||||
- **Solution** : Gestion correcte de la mémoire Rust
|
||||
|
||||
### Vulnérabilités Actives
|
||||
|
||||
Aucune vulnérabilité active connue.
|
||||
|
||||
## 🔧 Mesures de Sécurité
|
||||
|
||||
### Authentification
|
||||
|
||||
- **JWT** : Tokens sécurisés avec expiration
|
||||
- **Refresh Tokens** : Rotation automatique
|
||||
- **Multi-Factor** : Support pour l'authentification à deux facteurs
|
||||
- **Session Management** : Gestion sécurisée des sessions
|
||||
|
||||
### Autorisation
|
||||
|
||||
- **RBAC** : Contrôle d'accès basé sur les rôles
|
||||
- **Permissions** : Permissions granulaires
|
||||
- **Audit** : Logs d'audit complets
|
||||
- **Validation** : Validation des permissions côté serveur
|
||||
|
||||
### Chiffrement
|
||||
|
||||
- **HTTPS** : Chiffrement en transit
|
||||
- **WASM** : Chiffrement des données sensibles
|
||||
- **Local Storage** : Chiffrement des données locales
|
||||
- **APIs** : Chiffrement des communications
|
||||
|
||||
### Monitoring
|
||||
|
||||
- **Logs** : Logs de sécurité complets
|
||||
- **Alertes** : Alertes automatiques
|
||||
- **Audit** : Audit de sécurité régulier
|
||||
- **Incidents** : Gestion des incidents de sécurité
|
||||
|
||||
## 📋 Checklist de Sécurité
|
||||
|
||||
### Développement
|
||||
|
||||
- [ ] Validation des entrées utilisateur
|
||||
- [ ] Protection contre XSS
|
||||
- [ ] Protection contre CSRF
|
||||
- [ ] Authentification sécurisée
|
||||
- [ ] Autorisation appropriée
|
||||
- [ ] Chiffrement des données sensibles
|
||||
- [ ] Gestion sûre des erreurs
|
||||
- [ ] Tests de sécurité
|
||||
|
||||
### Déploiement
|
||||
|
||||
- [ ] Configuration HTTPS
|
||||
- [ ] Headers de sécurité
|
||||
- [ ] Variables d'environnement sécurisées
|
||||
- [ ] Permissions de fichiers appropriées
|
||||
- [ ] Monitoring de sécurité
|
||||
- [ ] Sauvegarde sécurisée
|
||||
- [ ] Documentation de sécurité
|
||||
|
||||
### Maintenance
|
||||
|
||||
- [ ] Mise à jour des dépendances
|
||||
- [ ] Audit de sécurité régulier
|
||||
- [ ] Monitoring des vulnérabilités
|
||||
- [ ] Tests de pénétration
|
||||
- [ ] Formation à la sécurité
|
||||
- [ ] Plan de réponse aux incidents
|
||||
|
||||
## 📞 Contact Sécurité
|
||||
|
||||
### Équipe de Sécurité
|
||||
|
||||
- **Email** : [security@4nkweb.com](mailto:security@4nkweb.com)
|
||||
- **PGP** : [Clé publique PGP](https://4nkweb.com/security.asc)
|
||||
- **Signalement** : [Formulaire de signalement](https://4nkweb.com/security)
|
||||
|
||||
### Réponse aux Incidents
|
||||
|
||||
1. **Détection** : Identification de l'incident
|
||||
2. **Containment** : Limitation de l'impact
|
||||
3. **Éradication** : Suppression de la cause
|
||||
4. **Récupération** : Retour à la normale
|
||||
5. **Post-mortem** : Analyse et amélioration
|
||||
|
||||
### Communication
|
||||
|
||||
- **Interne** : Communication avec l'équipe
|
||||
- **Utilisateurs** : Notification des utilisateurs
|
||||
- **Public** : Communication publique si nécessaire
|
||||
- **Autorités** : Notification des autorités si requis
|
||||
|
||||
---
|
||||
|
||||
**La sécurité est une responsabilité partagée. Merci de contribuer à maintenir ihm_client sécurisé !** 🔒
|
1
TEMPLATE_VERSION
Normal file
1
TEMPLATE_VERSION
Normal file
@ -0,0 +1 @@
|
||||
v2025.08.5
|
43
docker-compose.4nk-node.yml
Normal file
43
docker-compose.4nk-node.yml
Normal file
@ -0,0 +1,43 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
ihm_client:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.4nk-node
|
||||
container_name: 4nk-ihm-client
|
||||
ports:
|
||||
- "8080:80"
|
||||
- "3003:3003"
|
||||
environment:
|
||||
- SDK_RELAY_WS_URL=ws://sdk_relay_1:8090
|
||||
- SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091
|
||||
- BITCOIN_RPC_URL=http://bitcoin:18443
|
||||
- BLINDBIT_URL=http://blindbit:8000
|
||||
- NODE_ENV=production
|
||||
volumes:
|
||||
- ihm_client_logs:/var/log/nginx
|
||||
- ihm_client_data:/usr/share/nginx/html/data
|
||||
networks:
|
||||
- btcnet
|
||||
depends_on:
|
||||
- sdk_relay_1
|
||||
- sdk_relay_2
|
||||
- sdk_relay_3
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--quiet", "--tries=1", "--timeout=5", "--spider", "http://localhost"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
volumes:
|
||||
ihm_client_logs:
|
||||
driver: local
|
||||
ihm_client_data:
|
||||
driver: local
|
||||
|
||||
networks:
|
||||
btcnet:
|
||||
external: true
|
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/.
|
49
docs/API.md
Normal file
49
docs/API.md
Normal file
@ -0,0 +1,49 @@
|
||||
# API - ihm_client
|
||||
|
||||
Ce document décrit les interfaces publiques significatives exposées par l’interface `ihm_client`. Il ne contient aucun exemple d’usage exécutable et sert de référence de contrat.
|
||||
|
||||
## Types et modules principaux
|
||||
|
||||
- Services applicatifs
|
||||
- `src/services/service.ts` (classe `Services`) : opérations d’app, gestion des relays, pairing, processus, stockage, conversions hex/blob.
|
||||
- `src/services/token.ts` (classe `TokenService`) : génération/validation/refresh de jetons de session.
|
||||
- Utilitaires
|
||||
- `src/utils/sp-address.utils.ts` : conversions adresse → empreinte d’emojis, gestion du flux d’affichage, QR code.
|
||||
- `src/utils/html.utils.ts` : résolution du DOM racine ou `shadowRoot`.
|
||||
|
||||
## Contrats clés
|
||||
|
||||
- `Services.getInstance(): Promise<Services>`: retour singleton initialisé.
|
||||
- Pairing et processus
|
||||
- `createPairingProcess(userName: string, pairWith: string[]): Promise<ApiReturn>`
|
||||
- `confirmPairing(): Promise<void>`
|
||||
- `createProcess(...)`, `updateProcess(...)` : gestion des états/processus.
|
||||
- Données chiffrées
|
||||
- `getHashForFile(commitedIn: string, label: string, fileBlob: { type: string; data: Uint8Array }): string`
|
||||
- `getMerkleProofForFile(processState, attributeName): MerkleProofResult`
|
||||
- `validateMerkleProof(proof, hash): boolean`
|
||||
- Conversion binaire
|
||||
- `hexToBlob(hex: string): Blob`
|
||||
- `hexToUInt8Array(hex: string): Uint8Array`
|
||||
- `blobToHex(blob: Blob): Promise<string>`
|
||||
- Tokens
|
||||
- `TokenService.getInstance(): Promise<TokenService>`
|
||||
- `generateSessionToken(origin: string): Promise<{ accessToken: string; refreshToken: string }>`
|
||||
- `validateToken(token: string, origin: string): Promise<boolean>`
|
||||
- `refreshAccessToken(refreshToken: string, origin: string): Promise<string | null>`
|
||||
|
||||
## Invariants
|
||||
|
||||
- Les méthodes de `Services` supposent l’initialisation du module WASM (`pkg/sdk_client`) lors du `init()`.
|
||||
- `TokenService` requiert une clé de signature via `VITE_JWT_SECRET_KEY` (Vite ou environnement Node en test).
|
||||
- Les conversions hex/binaire doivent préserver l’intégrité des octets (longueur paire pour l’hex).
|
||||
|
||||
## Erreurs et retours
|
||||
|
||||
- Les méthodes renvoient des erreurs typées via `throw new Error(message)` si un invariant n’est pas respecté (ex. adresse manquante, état introuvable).
|
||||
- Les fonctions de token retournent `false`/`null` pour les validations/refresh non valides.
|
||||
|
||||
## Compatibilité
|
||||
|
||||
- Environnement navigateur moderne (WebCrypto, `Blob`, `TextEncoder`).
|
||||
- Tests sous Jest avec polyfills contrôlés dans `tests/setup.ts`.
|
570
docs/ARCHITECTURE.md
Normal file
570
docs/ARCHITECTURE.md
Normal file
@ -0,0 +1,570 @@
|
||||
# 🏗️ Architecture Technique - ihm_client
|
||||
|
||||
Documentation technique détaillée de l'architecture de l'interface utilisateur ihm_client.
|
||||
|
||||
## 📋 Vue d'Ensemble
|
||||
|
||||
### Architecture Générale
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ ihm_client │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ Frontend (Vue.js + TypeScript) │
|
||||
│ ├── Components Vue.js │
|
||||
│ ├── Services TypeScript │
|
||||
│ ├── Types et Interfaces │
|
||||
│ └── Utilitaires │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ WASM (Rust + sdk_client) │
|
||||
│ ├── Module WebAssembly │
|
||||
│ ├── Fonctions Silent Payments │
|
||||
│ └── Interface JavaScript │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ Build System (Vite) │
|
||||
│ ├── Compilation TypeScript │
|
||||
│ ├── Bundling et Optimisation │
|
||||
│ └── Hot Module Replacement │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Stack Technologique
|
||||
|
||||
| Couche | Technologie | Version | Rôle |
|
||||
|--------|-------------|---------|------|
|
||||
| **Frontend** | Vue.js | 3.x | Framework UI |
|
||||
| **Language** | TypeScript | 5.x | Typage statique |
|
||||
| **Build** | Vite | 5.x | Build tool |
|
||||
| **WASM** | Rust | 1.70+ | Logique métier |
|
||||
| **WASM Build** | wasm-pack | 0.12+ | Compilation WASM |
|
||||
| **Styling** | CSS3 | - | Styles |
|
||||
| **Package Manager** | npm | 8.x+ | Gestion dépendances |
|
||||
|
||||
## 🏛️ Architecture Frontend
|
||||
|
||||
### Structure des Composants
|
||||
|
||||
```
|
||||
src/
|
||||
├── components/ # Composants réutilisables
|
||||
│ ├── header/ # En-tête de l'application
|
||||
│ ├── modal/ # Modales et popups
|
||||
│ ├── qrcode-scanner/ # Scanner QR code
|
||||
│ └── validation-modal/ # Modales de validation
|
||||
├── pages/ # Pages de l'application
|
||||
│ ├── home/ # Page d'accueil
|
||||
│ ├── account/ # Gestion du compte
|
||||
│ ├── signature/ # Signatures de documents
|
||||
│ └── process-element/ # Gestion des processus
|
||||
├── services/ # Services et APIs
|
||||
│ ├── service.ts # Service principal
|
||||
│ ├── modal.service.ts # Gestion des modales
|
||||
│ ├── storage.service.ts # Gestion du stockage
|
||||
│ └── token.ts # Gestion des tokens
|
||||
├── types/ # Types TypeScript
|
||||
│ ├── sdk_client.d.ts # Types WASM
|
||||
│ └── raw-imports.d.ts # Types d'imports
|
||||
└── utils/ # Utilitaires
|
||||
├── document.utils.ts # Utilitaires documents
|
||||
├── html.utils.ts # Utilitaires HTML
|
||||
└── sp-address.utils.ts # Utilitaires Silent Payments
|
||||
```
|
||||
|
||||
### Architecture Vue.js
|
||||
|
||||
#### Composants Principaux
|
||||
|
||||
##### Header Component
|
||||
```typescript
|
||||
interface HeaderProps {
|
||||
user: User;
|
||||
notifications: Notification[];
|
||||
onLogout: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
**Responsabilités :**
|
||||
- Navigation principale
|
||||
- Affichage du profil utilisateur
|
||||
- Gestion des notifications
|
||||
- Menu de déconnexion
|
||||
|
||||
##### Modal Components
|
||||
```typescript
|
||||
interface ModalProps {
|
||||
isOpen: boolean;
|
||||
title: string;
|
||||
content: string;
|
||||
onConfirm: () => void;
|
||||
onCancel: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
**Types de modales :**
|
||||
- **Confirmation** : Actions critiques
|
||||
- **Validation** : Validation de données
|
||||
- **QR Scanner** : Scanner de codes QR
|
||||
- **Profile** : Édition du profil
|
||||
|
||||
##### QR Code Scanner
|
||||
```typescript
|
||||
interface QRScannerProps {
|
||||
onScan: (data: string) => void;
|
||||
onError: (error: Error) => void;
|
||||
onClose: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
**Fonctionnalités :**
|
||||
- Accès à la caméra
|
||||
- Détection de QR codes
|
||||
- Validation des données
|
||||
- Gestion des erreurs
|
||||
|
||||
### Services et Communication
|
||||
|
||||
#### Service Principal
|
||||
```typescript
|
||||
class Service {
|
||||
// Communication avec sdk_client WASM
|
||||
async generateWallet(): Promise<Wallet>;
|
||||
async lockUTXOs(wallet: Wallet, utxos: UTXO[]): Promise<boolean>;
|
||||
|
||||
// Communication avec les APIs
|
||||
async sendMessage(message: Message): Promise<void>;
|
||||
async uploadDocument(file: File): Promise<Document>;
|
||||
|
||||
// Gestion des données
|
||||
async saveData(key: string, data: any): Promise<void>;
|
||||
async loadData(key: string): Promise<any>;
|
||||
}
|
||||
```
|
||||
|
||||
#### Gestion des États
|
||||
|
||||
```typescript
|
||||
// Store global (Vuex/Pinia)
|
||||
interface AppState {
|
||||
user: User | null;
|
||||
wallet: Wallet | null;
|
||||
processes: Process[];
|
||||
notifications: Notification[];
|
||||
settings: Settings;
|
||||
}
|
||||
```
|
||||
|
||||
## ⚡ Architecture WASM
|
||||
|
||||
### Module sdk_client
|
||||
|
||||
#### Structure du Module
|
||||
```
|
||||
pkg/
|
||||
├── sdk_client_bg.wasm # Module WASM principal (3.3 MB)
|
||||
├── sdk_client.d.ts # Types TypeScript (12.6 KB)
|
||||
├── sdk_client.js # Wrapper JavaScript (182 B)
|
||||
├── sdk_client_bg.js # Code JavaScript généré (38 KB)
|
||||
└── package.json # Métadonnées du package
|
||||
```
|
||||
|
||||
#### Fonctions Principales
|
||||
|
||||
##### Gestion des Wallets
|
||||
```rust
|
||||
// Rust (sdk_client)
|
||||
pub fn generate_sp_wallet() -> Wallet {
|
||||
// Génération d'un nouveau wallet Silent Payment
|
||||
}
|
||||
|
||||
pub fn lock_freezed_utxos(wallet: Wallet, utxos: Vec<UTXO>) -> bool {
|
||||
// Verrouillage des UTXOs gelés
|
||||
}
|
||||
```
|
||||
|
||||
##### Interface JavaScript
|
||||
```typescript
|
||||
// TypeScript (ihm_client)
|
||||
import { generate_sp_wallet, lock_freezed_utxos } from 'pkg/sdk_client';
|
||||
|
||||
const wallet = generate_sp_wallet();
|
||||
const success = lock_freezed_utxos(wallet, utxos);
|
||||
```
|
||||
|
||||
### Intégration WASM-Frontend
|
||||
|
||||
#### Initialisation
|
||||
```typescript
|
||||
// Initialisation du module WASM
|
||||
import init from 'pkg/sdk_client';
|
||||
|
||||
async function initializeWASM() {
|
||||
try {
|
||||
await init();
|
||||
console.log('WASM module initialized');
|
||||
} catch (error) {
|
||||
console.error('Failed to initialize WASM:', error);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Communication
|
||||
```typescript
|
||||
// Appel de fonctions WASM
|
||||
async function createWallet() {
|
||||
try {
|
||||
const wallet = generate_sp_wallet();
|
||||
return wallet;
|
||||
} catch (error) {
|
||||
console.error('WASM error:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🔧 Architecture Build
|
||||
|
||||
### Configuration Vite
|
||||
|
||||
```typescript
|
||||
// vite.config.ts
|
||||
import { defineConfig } from 'vite';
|
||||
import vue from '@vitejs/plugin-vue';
|
||||
import wasm from 'vite-plugin-wasm';
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
vue(),
|
||||
wasm(),
|
||||
],
|
||||
optimizeDeps: {
|
||||
exclude: ['pkg/sdk_client']
|
||||
},
|
||||
build: {
|
||||
target: 'es2020',
|
||||
rollupOptions: {
|
||||
output: {
|
||||
manualChunks: {
|
||||
'sdk-client': ['pkg/sdk_client']
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### Processus de Build
|
||||
|
||||
#### Développement
|
||||
```bash
|
||||
# Serveur de développement
|
||||
npm run dev
|
||||
|
||||
# Hot Module Replacement activé
|
||||
# Compilation TypeScript en temps réel
|
||||
# Chargement WASM à la demande
|
||||
```
|
||||
|
||||
#### Production
|
||||
```bash
|
||||
# Build optimisé
|
||||
npm run build
|
||||
|
||||
# Optimisations :
|
||||
# - Tree shaking
|
||||
# - Code splitting
|
||||
# - Minification
|
||||
# - Compression gzip
|
||||
```
|
||||
|
||||
### Optimisations
|
||||
|
||||
#### Code Splitting
|
||||
```typescript
|
||||
// Chargement à la demande des composants
|
||||
const SignatureComponent = () => import('./pages/signature/signature-component.vue');
|
||||
const AccountComponent = () => import('./pages/account/account-component.vue');
|
||||
```
|
||||
|
||||
#### Lazy Loading WASM
|
||||
```typescript
|
||||
// Chargement différé du module WASM
|
||||
const loadWASM = async () => {
|
||||
if (!wasmModule) {
|
||||
wasmModule = await import('pkg/sdk_client');
|
||||
await wasmModule.default();
|
||||
}
|
||||
return wasmModule;
|
||||
};
|
||||
```
|
||||
|
||||
## 🔄 Flux de Données
|
||||
|
||||
### Flux Principal
|
||||
|
||||
```
|
||||
1. Utilisateur → Interface Vue.js
|
||||
2. Interface → Services TypeScript
|
||||
3. Services → Module WASM (sdk_client)
|
||||
4. WASM → APIs externes (si nécessaire)
|
||||
5. Réponse → Services → Interface → Utilisateur
|
||||
```
|
||||
|
||||
### Gestion des États
|
||||
|
||||
#### État Local (Composants)
|
||||
```typescript
|
||||
// État local d'un composant
|
||||
const componentState = reactive({
|
||||
loading: false,
|
||||
data: null,
|
||||
error: null
|
||||
});
|
||||
```
|
||||
|
||||
#### État Global (Store)
|
||||
```typescript
|
||||
// Store global de l'application
|
||||
const appStore = {
|
||||
user: ref<User | null>(null),
|
||||
wallet: ref<Wallet | null>(null),
|
||||
processes: ref<Process[]>([]),
|
||||
notifications: ref<Notification[]>([])
|
||||
};
|
||||
```
|
||||
|
||||
#### Persistance
|
||||
```typescript
|
||||
// Sauvegarde locale
|
||||
localStorage.setItem('user-data', JSON.stringify(userData));
|
||||
|
||||
// Synchronisation avec le serveur
|
||||
await service.syncData(userData);
|
||||
```
|
||||
|
||||
## 🔒 Architecture de Sécurité
|
||||
|
||||
### Sécurité Frontend
|
||||
|
||||
#### Validation des Entrées
|
||||
```typescript
|
||||
// Validation côté client
|
||||
function validateUserInput(input: string): boolean {
|
||||
return input.length > 0 && input.length < 100;
|
||||
}
|
||||
|
||||
// Sanitisation HTML
|
||||
function sanitizeHTML(html: string): string {
|
||||
return DOMPurify.sanitize(html);
|
||||
}
|
||||
```
|
||||
|
||||
#### Protection XSS
|
||||
```typescript
|
||||
// Échappement des données
|
||||
function escapeHTML(text: string): string {
|
||||
const div = document.createElement('div');
|
||||
div.textContent = text;
|
||||
return div.innerHTML;
|
||||
}
|
||||
```
|
||||
|
||||
### Sécurité WASM
|
||||
|
||||
#### Gestion de la Mémoire
|
||||
```rust
|
||||
// Rust - Gestion sûre de la mémoire
|
||||
pub fn process_data(data: Vec<u8>) -> Result<Vec<u8>, Error> {
|
||||
// Validation des données d'entrée
|
||||
if data.len() > MAX_SIZE {
|
||||
return Err(Error::DataTooLarge);
|
||||
}
|
||||
|
||||
// Traitement sécurisé
|
||||
let result = process_secure(data)?;
|
||||
Ok(result)
|
||||
}
|
||||
```
|
||||
|
||||
#### Protection des Clés
|
||||
```rust
|
||||
// Protection des clés privées
|
||||
pub struct SecureWallet {
|
||||
private_key: SecureString,
|
||||
public_key: String,
|
||||
}
|
||||
|
||||
impl SecureWallet {
|
||||
pub fn new() -> Self {
|
||||
let private_key = generate_secure_key();
|
||||
let public_key = derive_public_key(&private_key);
|
||||
|
||||
Self {
|
||||
private_key: SecureString::new(private_key),
|
||||
public_key,
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 Architecture de Performance
|
||||
|
||||
### Métriques de Performance
|
||||
|
||||
#### Temps de Chargement
|
||||
- **Premier rendu** : < 2s
|
||||
- **Interactivité** : < 3s
|
||||
- **Chargement complet** : < 5s
|
||||
|
||||
#### Optimisations
|
||||
|
||||
##### Bundle Size
|
||||
```bash
|
||||
# Taille des bundles
|
||||
dist/
|
||||
├── index.js # ~300 KB (gzippé)
|
||||
├── sdk_client.wasm # ~3.3 MB (gzippé)
|
||||
└── vendor.js # ~200 KB (gzippé)
|
||||
```
|
||||
|
||||
##### Lazy Loading
|
||||
```typescript
|
||||
// Chargement à la demande
|
||||
const routes = [
|
||||
{
|
||||
path: '/signature',
|
||||
component: () => import('./pages/signature.vue')
|
||||
}
|
||||
];
|
||||
```
|
||||
|
||||
##### Caching
|
||||
```typescript
|
||||
// Cache du module WASM
|
||||
const wasmCache = new Map();
|
||||
|
||||
async function getWASMModule() {
|
||||
if (wasmCache.has('sdk_client')) {
|
||||
return wasmCache.get('sdk_client');
|
||||
}
|
||||
|
||||
const module = await loadWASMModule();
|
||||
wasmCache.set('sdk_client', module);
|
||||
return module;
|
||||
}
|
||||
```
|
||||
|
||||
## 🔍 Monitoring et Observabilité
|
||||
|
||||
### Logs et Debugging
|
||||
|
||||
#### Logs Frontend
|
||||
```typescript
|
||||
// Logging structuré
|
||||
const logger = {
|
||||
info: (message: string, data?: any) => {
|
||||
console.log(`[INFO] ${message}`, data);
|
||||
},
|
||||
error: (message: string, error?: Error) => {
|
||||
console.error(`[ERROR] ${message}`, error);
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
#### Logs WASM
|
||||
```rust
|
||||
// Logging Rust
|
||||
use log::{info, error};
|
||||
|
||||
pub fn process_wallet() -> Result<Wallet, Error> {
|
||||
info!("Starting wallet processing");
|
||||
|
||||
match process_secure() {
|
||||
Ok(wallet) => {
|
||||
info!("Wallet processed successfully");
|
||||
Ok(wallet)
|
||||
},
|
||||
Err(e) => {
|
||||
error!("Wallet processing failed: {}", e);
|
||||
Err(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Métriques
|
||||
|
||||
#### Métriques Frontend
|
||||
- **Temps de rendu** : Performance des composants
|
||||
- **Temps de réponse** : Réactivité de l'interface
|
||||
- **Utilisation mémoire** : Consommation RAM
|
||||
- **Erreurs JavaScript** : Stabilité de l'application
|
||||
|
||||
#### Métriques WASM
|
||||
- **Temps d'initialisation** : Chargement du module
|
||||
- **Temps d'exécution** : Performance des fonctions
|
||||
- **Utilisation mémoire** : Gestion de la mémoire
|
||||
- **Erreurs Rust** : Stabilité du module
|
||||
|
||||
## 🚀 Déploiement
|
||||
|
||||
### Environnements
|
||||
|
||||
#### Développement
|
||||
```bash
|
||||
# Serveur de développement
|
||||
npm run dev
|
||||
|
||||
# Variables d'environnement
|
||||
NODE_ENV=development
|
||||
VITE_API_URL=http://localhost:8091
|
||||
VITE_WS_URL=ws://localhost:8090
|
||||
```
|
||||
|
||||
#### Production
|
||||
```bash
|
||||
# Build de production
|
||||
npm run build
|
||||
|
||||
# Variables d'environnement
|
||||
NODE_ENV=production
|
||||
VITE_API_URL=https://api.4nkweb.com
|
||||
VITE_WS_URL=wss://ws.4nkweb.com
|
||||
```
|
||||
|
||||
### Intégration 4NK_node
|
||||
|
||||
#### Artefacts et serveur
|
||||
- Le Dockerfile de `ihm_client` produit uniquement les artefacts `dist/`.
|
||||
- Le serveur (Nginx) est géré par `4NK_node` qui consomme `dist/`.
|
||||
|
||||
#### Variables d'Environnement
|
||||
```bash
|
||||
# Configuration pour 4NK_node
|
||||
SDK_RELAY_WS_URL=ws://sdk_relay_1:8090
|
||||
SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091
|
||||
BITCOIN_RPC_URL=http://bitcoin:18443
|
||||
BLINDBIT_URL=http://blindbit:8000
|
||||
```
|
||||
|
||||
## 🔮 Évolutions Futures
|
||||
|
||||
### Améliorations Planifiées
|
||||
|
||||
#### Performance
|
||||
- **Web Workers** : Traitement en arrière-plan
|
||||
- **Service Workers** : Cache et offline
|
||||
- **WebAssembly SIMD** : Optimisations vectorielles
|
||||
|
||||
#### Fonctionnalités
|
||||
- **PWA** : Application web progressive
|
||||
- **Offline Mode** : Fonctionnement hors ligne
|
||||
- **Real-time Sync** : Synchronisation temps réel
|
||||
|
||||
#### Sécurité
|
||||
- **Hardware Security** : Intégration TPM/SE
|
||||
- **Multi-factor Auth** : Authentification à deux facteurs
|
||||
- **Audit Trail** : Traçabilité complète
|
||||
|
||||
---
|
||||
|
||||
**🏗️ Architecture ihm_client - Conçue pour la performance et la sécurité** 🚀
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
5
docs/COMMUNITY_GUIDE.md
Normal file
5
docs/COMMUNITY_GUIDE.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Guide de la communauté - ihm_client
|
||||
|
||||
- Comment contribuer (issues, PR, revues)
|
||||
- Standards de code et de documentation
|
||||
- Processus de release et de support
|
34
docs/CONFIGURATION.md
Normal file
34
docs/CONFIGURATION.md
Normal file
@ -0,0 +1,34 @@
|
||||
# Configuration - ihm_client
|
||||
|
||||
Ce document synthétise la configuration de l’application et des outils. Il complète `INSTALLATION.md`.
|
||||
|
||||
## Variables d’environnement
|
||||
|
||||
- Variables Vite (navigateur)
|
||||
- `VITE_API_URL`: URL HTTP du relais/API.
|
||||
- `VITE_WS_URL`: URL WS du relais.
|
||||
- `VITE_WASM_PATH`: chemin vers `pkg/sdk_client_bg.wasm`.
|
||||
- `VITE_JWT_SECRET_KEY`: clé de signature des JWT (utilisée par `TokenService`).
|
||||
- Intégration 4NK_node (serveur géré côté 4NK_node, artefacts `dist/` produits ici)
|
||||
- `SDK_RELAY_WS_URL`, `SDK_RELAY_HTTP_URL`, `BITCOIN_RPC_URL`, `BLINDBIT_URL`.
|
||||
|
||||
## Build
|
||||
|
||||
- Outil: Vite 5 + TypeScript 5.
|
||||
- Ciblage: `es2020`+.
|
||||
- WASM: `vite-plugin-wasm`, bundle différé conseillé.
|
||||
|
||||
## Tests
|
||||
|
||||
- Jest 29 + `ts-jest`.
|
||||
- `tests/setup.ts` injecte polyfills et mocks.
|
||||
|
||||
## Résolution des modules
|
||||
|
||||
- Aliases: `~/*` → `src/*` (cf. `tsconfig.json`).
|
||||
- Mapper: `jest.config.js` mappe `pkg/` vers `pkg/` local.
|
||||
|
||||
## CI/CD
|
||||
|
||||
- Étapes minimales: install, tests, build, artefacts.
|
||||
- Audit dépendances à intégrer selon politique sécurité.
|
99
docs/FONCTIONNEL.md
Normal file
99
docs/FONCTIONNEL.md
Normal file
@ -0,0 +1,99 @@
|
||||
# Documentation fonctionnelle - ihm_client
|
||||
|
||||
Cette documentation décrit ce que fait fonctionnellement l’interface `ihm_client`, les parcours utilisateurs, les règles de gestion et les contraintes associées. Aucun exemple de code applicatif n’est inclus.
|
||||
|
||||
## Objectif produit
|
||||
|
||||
- Proposer une interface moderne pour la gestion de processus collaboratifs autour des Silent Payments.
|
||||
- Faciliter le pairing sécurisé entre appareils/utilisateurs et la gestion des transactions associées.
|
||||
- Offrir un espace unifié pour la gestion des membres, documents, signatures et échanges (chat/notifications).
|
||||
|
||||
## Personas et rôles
|
||||
|
||||
- Utilisateur standard: initie/participe à des processus, signe des documents, échange des messages.
|
||||
- Administrateur de processus: configure les rôles, vérifie les validations, déclenche des mises à jour.
|
||||
- Observateur (lecture seule): consulte les informations publiques/partagées sans intervenir.
|
||||
|
||||
## Parcours principaux
|
||||
|
||||
### Accueil
|
||||
- Accès rapide aux sections clés (Compte, Processus, Signature, Chat, Pairing).
|
||||
- Indicateurs d’activité: processus actifs, notifications récentes, métriques succinctes.
|
||||
|
||||
### Pairing (mise en relation)
|
||||
- Objectif: établir une relation de confiance entre appareils via adresse Silent Payment.
|
||||
- Étapes:
|
||||
1. Saisir ou scanner l’adresse SP distante (ou URL contenant `sp_address`).
|
||||
2. Vérifier l’empreinte visuelle (emojis) dérivée de l’adresse pour confirmer l’identité.
|
||||
3. Créer et confirmer le processus de pairing (flux guidé, confirmation finale).
|
||||
- Résultat: l’appareil local est appairé; les échanges sécurisés sont possibles.
|
||||
|
||||
### Wallet et relays
|
||||
- Visualiser l’état du wallet (montant disponible, synchro via relays).
|
||||
- Interagir avec le réseau via relays (mise à jour des membres/états, échange de messages techniques).
|
||||
- Disposer d’un mécanisme de “faucet” en environnement de test pour provisionner le wallet.
|
||||
|
||||
### Processus
|
||||
- Créer un nouveau processus (données publiques et privées, rôles, règles de validation).
|
||||
- Mettre à jour un processus existant (évolution des états, validations, preuves).
|
||||
- Consulter l’historique (états validés, états en attente/non committés).
|
||||
|
||||
### Membres et rôles
|
||||
- Gérer les membres impliqués (par adresse SP).
|
||||
- Définir des rôles et règles de validation (quorum, champs soumis à contrôle, seuils).
|
||||
- Vérifier l’appartenance de l’utilisateur à un rôle (autorisation implicite des actions).
|
||||
|
||||
### Documents et signatures
|
||||
- Associer des documents aux processus (hashés et stockés via mécanismes dédiés).
|
||||
- Déclencher des demandes de signature, suivre leur statut (en attente, signé, expiré).
|
||||
- Vérifier/valider les preuves (ex. Merkle) liées aux documents échangés.
|
||||
|
||||
### Chat et notifications
|
||||
- Échanger des messages dans le contexte des processus.
|
||||
- Recevoir des notifications liées aux événements (nouvelle transaction, demande de signature, mise à jour de processus).
|
||||
|
||||
## Règles de gestion clés
|
||||
|
||||
- Pairing
|
||||
- Une empreinte visuelle (emojis) dérivée de l’adresse SP aide à la confirmation utilisateur.
|
||||
- Un processus de pairing doit inclure l’adresse de l’appareil local.
|
||||
- Validation
|
||||
- Les règles de validation (quorum, seuils) s’appliquent aux champs déclarés.
|
||||
- Une mise à jour de processus peut être refusée si les preuves/validations sont insuffisantes.
|
||||
- Données
|
||||
- Les données volumineuses (blobs) sont stockées séparément et référencées par hash.
|
||||
- Les attributs chiffrés nécessitent clés/permissions pour être déchiffrés.
|
||||
- Sécurité
|
||||
- Les échanges sont consolidés via relays; l’appairage conditionne l’accès aux données privées.
|
||||
- Les tokens de session sont temporaires et régénérables (Access/Refresh).
|
||||
|
||||
## Contraintes et limites
|
||||
|
||||
- Dépendance au module WASM pour les opérations de bas niveau (Silent Payments, encodages, preuves).
|
||||
- Nécessité d’un ou plusieurs relays disponibles pour la synchronisation et l’échange d’informations.
|
||||
- Performance dépendant du contexte (navigateur, réseau, taille des données).
|
||||
|
||||
## Indicateurs et métriques
|
||||
|
||||
- Disponibilité des relays et latence observée.
|
||||
- État de synchronisation (hauteur de bloc, mises à jour reçues).
|
||||
- Taille et temps de manipulation des documents.
|
||||
- Taux de succès des signatures et validations.
|
||||
|
||||
## Gestion des erreurs et non-régression
|
||||
|
||||
- Messages d’erreur explicites pour états manquants, adresses invalides, clés indisponibles, connexions relays.
|
||||
- Tests unitaires couvrant conversions (hex/blob), DOM utilitaire et tokens.
|
||||
- Stratégie de test documentée (voir `docs/TESTING.md`).
|
||||
|
||||
## Confidentialité et conformité
|
||||
|
||||
- Pas de stockage permanent de secrets en clair côté client.
|
||||
- Utilisation stricte de variables d’environnement pour les secrets runtime.
|
||||
- Revue régulière des dépendances et audits sécurité (voir `docs/SECURITY_AUDIT.md`).
|
||||
|
||||
## Support et usage
|
||||
|
||||
- Guides d’installation et d’utilisation (voir `docs/INSTALLATION.md`, `docs/USAGE.md`).
|
||||
- Référentiel contractuel des API (voir `docs/API.md`).
|
||||
- Intégration dans un site via iframe (voir `docs/INTEGRATION_IFRAME.md`).
|
17
docs/GITEA_SETUP.md
Normal file
17
docs/GITEA_SETUP.md
Normal file
@ -0,0 +1,17 @@
|
||||
# Configuration Gitea - ihm_client
|
||||
|
||||
## Repository
|
||||
- Création du dépôt sur `git.4nkweb.com`
|
||||
- Droits d’écriture/lecture selon rôle
|
||||
|
||||
## SSH
|
||||
- Ajout de la clé dans Settings > SSH Keys
|
||||
- Scripts: `scripts/init-ssh-env.sh`, `scripts/auto-ssh-push.sh`
|
||||
|
||||
## CI/CD
|
||||
- Workflows dans `.gitea/workflows/` (à définir selon pipeline)
|
||||
- Politique de branche: protection de `main`/`docker-support`
|
||||
|
||||
## Permissions
|
||||
- Maintainers: merge + tags
|
||||
- Contributeurs: PRs avec validation
|
219
docs/INDEX.md
Normal file
219
docs/INDEX.md
Normal file
@ -0,0 +1,219 @@
|
||||
# 📚 Index de Documentation - ihm_client
|
||||
|
||||
Index complet de la documentation de l'interface utilisateur ihm_client pour les Silent Payments.
|
||||
|
||||
## 📖 Guides Principaux
|
||||
|
||||
### 🚀 [Guide d'Installation](INSTALLATION.md)
|
||||
Guide complet pour installer et configurer l'interface utilisateur ihm_client.
|
||||
- **Prérequis système et logiciels**
|
||||
- **Installation de Node.js et dépendances**
|
||||
- **Configuration Rust et WASM**
|
||||
- **Configuration des dépendances distantes**
|
||||
- **Tests post-installation**
|
||||
- **Dépannage et monitoring**
|
||||
|
||||
### 📖 [Guide d'Utilisation](USAGE.md)
|
||||
### 🧭 [Documentation fonctionnelle](FONCTIONNEL.md)
|
||||
Description fonctionnelle complète (parcours, règles de gestion, contraintes).
|
||||
Guide complet pour utiliser l'interface utilisateur ihm_client au quotidien.
|
||||
- **Démarrage du serveur de développement**
|
||||
- **Utilisation de l'interface utilisateur**
|
||||
- **Navigation Accueil et Compte**
|
||||
- **Opérations de pairing et wallet**
|
||||
- **Tests et validation**
|
||||
|
||||
### ⚙️ [Guide de Configuration](CONFIGURATION.md)
|
||||
Guide complet pour configurer l'interface selon vos besoins.
|
||||
- **Configuration générale et variables d'environnement**
|
||||
- **Configuration Vue.js et TypeScript**
|
||||
- **Configuration WASM et sdk_client**
|
||||
- **Configuration de l'intégration 4NK_node**
|
||||
- **Configuration Docker et production**
|
||||
- **Configuration SSL/TLS**
|
||||
- **Configuration de monitoring et sauvegarde**
|
||||
|
||||
## 🔧 Guides Techniques
|
||||
|
||||
### 🏗️ [Architecture Technique](ARCHITECTURE.md)
|
||||
Documentation technique détaillée de l'architecture.
|
||||
- **Architecture générale du frontend**
|
||||
- **Composants principaux (Vue.js, TypeScript, WASM)**
|
||||
- **Intégration avec sdk_client et sdk_common**
|
||||
- **Flux de données entre composants**
|
||||
- **Architecture des Silent Payments**
|
||||
- **Sécurité et isolation**
|
||||
- **Performance et optimisations**
|
||||
- **Monitoring et observabilité**
|
||||
|
||||
### 📡 [API](API.md)
|
||||
Documentation contractuelle des APIs disponibles.
|
||||
- **API sdk_client WASM** : Interface WebAssembly pour les Silent Payments
|
||||
- **API Vue.js Components** : Composants réutilisables
|
||||
- **API Services** : Services de communication et gestion
|
||||
- **API Types TypeScript** : Types et interfaces
|
||||
- **Format des données et payloads**
|
||||
- **Gestion des erreurs**
|
||||
- **Exemples d'utilisation**
|
||||
- **Limites et quotas**
|
||||
|
||||
### 🔒 [Sécurité](SECURITY.md)
|
||||
Guide de sécurité et bonnes pratiques.
|
||||
- **Authentification et autorisation**
|
||||
- **Protection XSS et CSRF**
|
||||
- **Sécurité WASM et mémoire**
|
||||
- **Chiffrement et certificats**
|
||||
- **Audit et monitoring de sécurité**
|
||||
- **Bonnes pratiques frontend**
|
||||
|
||||
### 🐙 [Configuration Gitea](GITEA_SETUP.md)
|
||||
Guide de configuration spécifique pour Gitea.
|
||||
- **Configuration du repository Gitea**
|
||||
- **Templates d'issues et pull requests**
|
||||
- **Configuration CI/CD avec Gitea Actions**
|
||||
- **Intégrations et webhooks**
|
||||
- **Workflow de contribution**
|
||||
- **Sécurité et permissions**
|
||||
|
||||
### 🚀 [Plan de Release](RELEASE_PLAN.md)
|
||||
Plan de lancement open source complet.
|
||||
- **Phases de préparation**
|
||||
- **Communication et marketing**
|
||||
- **Checklist de lancement**
|
||||
- **Support communautaire**
|
||||
- **Gestion des risques**
|
||||
|
||||
### 🌟 [Guide de la Communauté](COMMUNITY_GUIDE.md)
|
||||
Guide complet pour la communauté.
|
||||
- **Comment contribuer**
|
||||
- **Ressources d'apprentissage**
|
||||
- **Environnement de développement**
|
||||
- **Processus de contribution**
|
||||
- **Support et reconnaissance**
|
||||
|
||||
### 🗺️ [Roadmap](ROADMAP.md)
|
||||
Roadmap de développement détaillée.
|
||||
- **Timeline de développement**
|
||||
- **Fonctionnalités planifiées**
|
||||
- **Évolution de l'architecture**
|
||||
- **Métriques de succès**
|
||||
|
||||
## 🧪 Guides de Test
|
||||
|
||||
### 🧪 [Guide des Tests](TESTING.md)
|
||||
Guide complet pour les tests de l'interface utilisateur.
|
||||
- **Tests unitaires Vue.js**
|
||||
- **Tests d'intégration WASM**
|
||||
- **Tests end-to-end (Playwright)**
|
||||
- **Tests de performance**
|
||||
- **Tests de sécurité**
|
||||
- **Tests d'accessibilité**
|
||||
- **Tests de compatibilité navigateur**
|
||||
|
||||
### 🔍 [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**
|
||||
- **Debugging et profiling**
|
||||
- **Optimisation des performances**
|
||||
- **Déploiement et CI/CD**
|
||||
|
||||
### 📋 [Référence Rapide](QUICK_REFERENCE.md)
|
||||
Référence rapide pour les développeurs.
|
||||
- **Commandes essentielles**
|
||||
- **Structure du projet**
|
||||
- **APIs principales**
|
||||
- **Configuration rapide**
|
||||
- **Dépannage rapide**
|
||||
|
||||
### 🔄 [Guide de Migration](MIGRATION.md)
|
||||
Guide pour les migrations et mises à jour.
|
||||
- **Migration des versions**
|
||||
- **Breaking changes**
|
||||
- **Mise à jour des dépendances**
|
||||
- **Migration des données**
|
||||
- **Tests de migration**
|
||||
|
||||
## 🌐 Guides d'Intégration
|
||||
|
||||
### 🧩 [Intégration iframe](INTEGRATION_IFRAME.md)
|
||||
Spécification de messagerie postMessage (requêtes/réponses, erreurs, prérequis).
|
||||
|
||||
### 🔑 [Configuration SSH](SSH_USAGE.md)
|
||||
Guide de configuration SSH pour le développement.
|
||||
- **Génération des clés SSH**
|
||||
- **Configuration Git**
|
||||
- **Intégration avec Gitea**
|
||||
- **Automatisation des déploiements**
|
||||
|
||||
### 🤖 [Push SSH Automatisé](AUTO_SSH_PUSH.md)
|
||||
Guide pour l'automatisation des pushes SSH.
|
||||
- **Configuration des scripts**
|
||||
- **Intégration CI/CD**
|
||||
- **Gestion des clés**
|
||||
- **Sécurité et bonnes pratiques**
|
||||
|
||||
## 📊 État et Monitoring
|
||||
|
||||
### 📊 [Référence rapide](QUICK_REFERENCE.md)
|
||||
Raccourcis d’accès (commandes, dossiers, URLs) pour démarrer vite.
|
||||
|
||||
|
||||
## 🔧 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 ihm_client
|
||||
2. [Configuration](CONFIGURATION.md) - Configurer l'environnement
|
||||
3. [Utilisation](USAGE.md) - Utiliser l'interface
|
||||
|
||||
### 🔧 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. [Quick Reference](QUICK_REFERENCE.md) - Référence rapide
|
||||
3. [Roadmap](ROADMAP.md) - Évolution du projet
|
||||
|
||||
### 🤝 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
|
||||
|
||||
---
|
||||
|
||||
**📚 Documentation complète pour ihm_client - Interface utilisateur moderne pour les Silent Payments** 🚀
|
374
docs/INSTALLATION.md
Normal file
374
docs/INSTALLATION.md
Normal file
@ -0,0 +1,374 @@
|
||||
# 📦 Guide d'Installation - ihm_client
|
||||
|
||||
Guide complet pour installer et configurer l'interface utilisateur ihm_client pour les Silent Payments.
|
||||
|
||||
## 📋 Prérequis
|
||||
|
||||
### Système
|
||||
|
||||
- **OS** : Linux (Ubuntu 20.04+, Debian 11+, CentOS 8+), macOS 10.15+, Windows 10+
|
||||
- **Architecture** : x86_64, ARM64 (Apple Silicon)
|
||||
- **RAM** : 4 Go minimum, 8 Go recommandés
|
||||
- **Stockage** : 5 Go minimum, 10 Go recommandés
|
||||
- **Réseau** : Connexion Internet stable
|
||||
|
||||
### Logiciels
|
||||
|
||||
- **Node.js** : Version 18.0+ (LTS recommandé)
|
||||
- **npm** : Version 8.0+
|
||||
- **Git** : Version 2.25+
|
||||
- **Rust** : Version 1.70+ (pour la compilation WASM)
|
||||
- **Docker** : Version 20.10+ (optionnel, pour l'intégration 4NK_node)
|
||||
|
||||
## 🚀 Installation
|
||||
|
||||
### 1. Installation de Node.js
|
||||
|
||||
#### Ubuntu/Debian
|
||||
|
||||
```bash
|
||||
# Mettre à jour les paquets
|
||||
sudo apt update
|
||||
|
||||
# Installer Node.js via NodeSource
|
||||
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
||||
sudo apt-get install -y nodejs
|
||||
|
||||
# Vérifier l'installation
|
||||
node --version
|
||||
npm --version
|
||||
```
|
||||
|
||||
#### CentOS/RHEL
|
||||
|
||||
```bash
|
||||
# Installer Node.js via NodeSource
|
||||
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
|
||||
sudo yum install -y nodejs
|
||||
|
||||
# Vérifier l'installation
|
||||
node --version
|
||||
npm --version
|
||||
```
|
||||
|
||||
#### macOS
|
||||
|
||||
```bash
|
||||
# Installer via Homebrew
|
||||
brew install node@18
|
||||
|
||||
# Ou télécharger depuis nodejs.org
|
||||
# https://nodejs.org/en/download/
|
||||
```
|
||||
|
||||
#### Windows
|
||||
|
||||
```bash
|
||||
# Télécharger et installer depuis
|
||||
# https://nodejs.org/en/download/
|
||||
```
|
||||
|
||||
### 2. Installation de Rust
|
||||
|
||||
#### Linux/macOS
|
||||
|
||||
```bash
|
||||
# Installer Rust via rustup
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||
|
||||
# Recharger l'environnement
|
||||
source ~/.cargo/env
|
||||
|
||||
# Vérifier l'installation
|
||||
rustc --version
|
||||
cargo --version
|
||||
```
|
||||
|
||||
#### Windows
|
||||
|
||||
```bash
|
||||
# Télécharger et installer rustup depuis
|
||||
# https://rustup.rs/
|
||||
```
|
||||
|
||||
### 3. Installation de wasm-pack
|
||||
|
||||
```bash
|
||||
# Installer wasm-pack
|
||||
cargo install wasm-pack
|
||||
|
||||
# Vérifier l'installation
|
||||
wasm-pack --version
|
||||
```
|
||||
|
||||
### 4. Configuration SSH (Recommandé)
|
||||
|
||||
```bash
|
||||
# Générer une clé SSH
|
||||
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_ihm -C "ihm-client-automation"
|
||||
|
||||
# Ajouter à l'agent SSH
|
||||
ssh-add ~/.ssh/id_ed25519_ihm
|
||||
|
||||
# Configurer Git pour utiliser la clé
|
||||
git config --global core.sshCommand "ssh -i ~/.ssh/id_ed25519_ihm"
|
||||
|
||||
# Afficher la clé publique pour Gitea
|
||||
cat ~/.ssh/id_ed25519_ihm.pub
|
||||
```
|
||||
|
||||
**Ajouter la clé publique à Gitea :**
|
||||
1. Aller sur Gitea > Settings > SSH Keys
|
||||
2. Coller la clé publique
|
||||
3. Cliquer sur "Add key"
|
||||
|
||||
### 5. Clonage du Repository
|
||||
|
||||
```bash
|
||||
# Cloner avec SSH (recommandé)
|
||||
git clone git@git.4nkweb.com:4nk/ihm_client.git
|
||||
cd ihm_client
|
||||
|
||||
# Ou cloner avec HTTPS
|
||||
git clone https://git.4nkweb.com/4nk/ihm_client.git
|
||||
cd ihm_client
|
||||
```
|
||||
|
||||
### 6. Installation des Dépendances
|
||||
|
||||
```bash
|
||||
# Installer les dépendances Node.js
|
||||
npm install
|
||||
|
||||
# Vérifier l'installation
|
||||
npm list --depth=0
|
||||
```
|
||||
|
||||
### 7. Configuration des Dépendances WASM
|
||||
|
||||
```bash
|
||||
# Configurer les dépendances distantes (sdk_client, sdk_common)
|
||||
./scripts/setup-remote-deps.sh
|
||||
|
||||
# Vérifier la compilation WASM
|
||||
ls -la pkg/
|
||||
```
|
||||
|
||||
## 🔧 Configuration
|
||||
|
||||
### Variables d'Environnement
|
||||
|
||||
Créer un fichier `.env` à la racine du projet :
|
||||
|
||||
```bash
|
||||
# Configuration de développement
|
||||
NODE_ENV=development
|
||||
VITE_DEV_SERVER_PORT=3000
|
||||
VITE_API_URL=http://localhost:8091
|
||||
VITE_WS_URL=ws://localhost:8090
|
||||
|
||||
# Configuration WASM
|
||||
VITE_WASM_PATH=./pkg/sdk_client_bg.wasm
|
||||
|
||||
# Configuration pour l'intégration 4NK_node
|
||||
SDK_RELAY_WS_URL=ws://sdk_relay_1:8090
|
||||
SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091
|
||||
BITCOIN_RPC_URL=http://bitcoin:18443
|
||||
BLINDBIT_URL=http://blindbit:8000
|
||||
```
|
||||
|
||||
### Configuration TypeScript
|
||||
|
||||
Le fichier `tsconfig.json` est déjà configuré pour :
|
||||
- Vue.js 3
|
||||
- TypeScript strict
|
||||
- Support WASM
|
||||
- Path mapping
|
||||
|
||||
### Configuration Vite
|
||||
|
||||
Le fichier `vite.config.ts` est configuré pour :
|
||||
- Support WASM
|
||||
- Hot module replacement
|
||||
- Build optimisé
|
||||
- Support des types TypeScript
|
||||
|
||||
## 🧪 Tests Post-Installation
|
||||
|
||||
### 1. Test de Compilation
|
||||
|
||||
```bash
|
||||
# Test de compilation TypeScript
|
||||
npm run build
|
||||
|
||||
# Vérifier le build
|
||||
ls -la dist/
|
||||
```
|
||||
|
||||
### 2. Test de Développement
|
||||
|
||||
```bash
|
||||
# Démarrer le serveur de développement
|
||||
npm run dev
|
||||
|
||||
# Ouvrir http://localhost:3000 dans le navigateur
|
||||
```
|
||||
|
||||
### 3. Test WASM
|
||||
|
||||
```bash
|
||||
# Vérifier que le module WASM fonctionne
|
||||
npm run test:wasm
|
||||
```
|
||||
|
||||
### 4. Test Complet
|
||||
|
||||
```bash
|
||||
# Exécuter tous les tests
|
||||
npm run test
|
||||
|
||||
# Vérifier la couverture
|
||||
npm run test:coverage
|
||||
```
|
||||
|
||||
## 🚨 Dépannage
|
||||
|
||||
### Problèmes Courants
|
||||
|
||||
#### Node.js non trouvé
|
||||
```bash
|
||||
# Vérifier l'installation
|
||||
which node
|
||||
node --version
|
||||
|
||||
# Réinstaller si nécessaire
|
||||
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
||||
sudo apt-get install -y nodejs
|
||||
```
|
||||
|
||||
#### Rust non trouvé
|
||||
```bash
|
||||
# Vérifier l'installation
|
||||
which rustc
|
||||
rustc --version
|
||||
|
||||
# Réinstaller si nécessaire
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||
source ~/.cargo/env
|
||||
```
|
||||
|
||||
#### Erreurs de compilation WASM
|
||||
```bash
|
||||
# Nettoyer et recompiler
|
||||
rm -rf pkg/
|
||||
./scripts/setup-remote-deps.sh
|
||||
|
||||
# Vérifier les dépendances Rust
|
||||
cd temp-deps/sdk_client
|
||||
cargo check
|
||||
```
|
||||
|
||||
#### Erreurs de dépendances npm
|
||||
```bash
|
||||
# Nettoyer et réinstaller
|
||||
rm -rf node_modules/ package-lock.json
|
||||
npm install
|
||||
|
||||
# Vérifier les vulnérabilités
|
||||
npm audit
|
||||
npm audit fix
|
||||
```
|
||||
|
||||
#### Problèmes de permissions
|
||||
```bash
|
||||
# Corriger les permissions
|
||||
sudo chown -R $USER:$USER .
|
||||
chmod +x scripts/*.sh
|
||||
```
|
||||
|
||||
### Logs Détaillés
|
||||
|
||||
```bash
|
||||
# Logs de compilation TypeScript
|
||||
npm run build --verbose
|
||||
|
||||
# Logs de compilation WASM
|
||||
cd temp-deps/sdk_client
|
||||
wasm-pack build --target web --out-dir ../../pkg --verbose
|
||||
|
||||
# Logs du serveur de développement
|
||||
npm run dev --verbose
|
||||
```
|
||||
|
||||
## 🔒 Sécurité
|
||||
|
||||
### Vérifications de Sécurité
|
||||
|
||||
```bash
|
||||
# Audit des dépendances npm
|
||||
npm audit
|
||||
|
||||
# Audit des dépendances Rust
|
||||
cargo audit
|
||||
|
||||
# Vérification des vulnérabilités WASM
|
||||
wasm-pack build --target web --out-dir ../../pkg
|
||||
```
|
||||
|
||||
### Bonnes Pratiques
|
||||
|
||||
- Utiliser HTTPS en production
|
||||
- Valider toutes les entrées utilisateur
|
||||
- Maintenir les dépendances à jour
|
||||
- Utiliser des variables d'environnement pour les secrets
|
||||
- Tester régulièrement la sécurité
|
||||
|
||||
## 📊 Monitoring
|
||||
|
||||
### Métriques d'Installation
|
||||
|
||||
```bash
|
||||
# Taille du projet
|
||||
du -sh .
|
||||
|
||||
# Nombre de fichiers
|
||||
find . -type f | wc -l
|
||||
|
||||
# Dépendances installées
|
||||
npm list --depth=0 | wc -l
|
||||
|
||||
# Taille du module WASM
|
||||
ls -lh pkg/sdk_client_bg.wasm
|
||||
```
|
||||
|
||||
### Vérification de l'Installation
|
||||
|
||||
```bash
|
||||
# Script de vérification
|
||||
./scripts/verify-installation.sh
|
||||
|
||||
# Tests automatisés
|
||||
npm run test:installation
|
||||
```
|
||||
|
||||
## 🎯 Prochaines Étapes
|
||||
|
||||
Après l'installation réussie :
|
||||
|
||||
1. **Lire le [Guide d'Utilisation](USAGE.md)** - Utiliser l'interface
|
||||
2. **Consulter l'[Architecture](ARCHITECTURE.md)** - Comprendre le système
|
||||
3. **Explorer les [APIs](API.md)** - Utiliser les fonctionnalités
|
||||
4. **Consulter l'[Intégration iframe](INTEGRATION_IFRAME.md)** - Intégrer dans un site hôte
|
||||
|
||||
## 📞 Support
|
||||
|
||||
En cas de problème :
|
||||
|
||||
1. Consulter la [documentation](INDEX.md)
|
||||
2. Vérifier les [issues existantes](https://git.4nkweb.com/4nk/ihm_client/issues)
|
||||
3. Créer une nouvelle issue avec les détails du problème
|
||||
4. Inclure les logs et la configuration utilisée
|
||||
|
||||
---
|
||||
|
||||
**🚀 Installation terminée ! ihm_client est prêt à être utilisé.** ✨
|
156
docs/INTEGRATION_IFRAME.md
Normal file
156
docs/INTEGRATION_IFRAME.md
Normal file
@ -0,0 +1,156 @@
|
||||
# Intégration iframe – Spécification de messagerie
|
||||
|
||||
Ce document définit les échanges entre un site hôte et `ihm_client` intégré en iframe, via `window.postMessage`. Aucun exemple de code exécutable n’est inclus.
|
||||
|
||||
## Principes
|
||||
|
||||
- Canal: postMessage entre la page parente et l’iframe `ihm_client`.
|
||||
- Découverte: `ihm_client` émet `LISTENING` pour signaler la disponibilité des listeners (côté iframe). En mode E2E (`?e2e=1`) et seulement lorsque l’app tourne en iframe, `LISTENING` est émis périodiquement (jusqu’à 100 fois) pour éviter les courses de tests. Hors E2E, pas d’émission périodique.
|
||||
- Sécurité:
|
||||
- Utiliser la cible `event.origin` pour les réponses.
|
||||
- De nombreuses opérations exigent un `accessToken` valide (lié à `origin`).
|
||||
- `messageId` recommandé pour corréler requêtes/réponses.
|
||||
- Pré-requis: pour la plupart des actions de processus, l’appareil doit être appairé.
|
||||
|
||||
## Types de message
|
||||
|
||||
Référence: `src/models/process.model.ts` (enum `MessageType`).
|
||||
|
||||
### LISTENING
|
||||
- Émis par `ihm_client` au parent pour signaler la disponibilité des listeners.
|
||||
- Réception côté parent (aucune requête attendue). Pas de payload spécifique.
|
||||
|
||||
---
|
||||
|
||||
### REQUEST_LINK (Requête)
|
||||
- Objet: ouverture d’un consentement utilisateur pour lier l’hôte à l’appareil.
|
||||
- Requête (parent → iframe):
|
||||
- `type`: `REQUEST_LINK`
|
||||
- `messageId`: string (optionnel mais recommandé)
|
||||
- Réponses (iframe → parent):
|
||||
- Succès: `type`: `LINK_ACCEPTED`, `accessToken`: string, `refreshToken`: string, `messageId`
|
||||
- Erreur: `type`: `ERROR`, `error`: string, `messageId`
|
||||
|
||||
### VALIDATE_TOKEN (Requête)
|
||||
- Objet: vérifier la validité du couple `{accessToken, refreshToken}`.
|
||||
- Requête: `type`, `accessToken`, `refreshToken`, `messageId`
|
||||
- Réponse: `type`: `VALIDATE_TOKEN`, `isValid`: boolean, `accessToken`, `refreshToken`, `messageId`
|
||||
|
||||
### RENEW_TOKEN (Requête)
|
||||
- Objet: obtenir un nouveau `accessToken` depuis un `refreshToken`.
|
||||
- Requête: `type`, `refreshToken`, `messageId`
|
||||
- Réponses:
|
||||
- Succès: `type`: `RENEW_TOKEN`, `accessToken`, `refreshToken`, `messageId`
|
||||
- Erreur: `ERROR`
|
||||
|
||||
---
|
||||
|
||||
### CREATE_PAIRING (Requête)
|
||||
- Objet: initier l’appairage de l’appareil.
|
||||
- Pré-requis: `accessToken` valide; appareil non appairé.
|
||||
- Requête: `type`, `accessToken`, `messageId`
|
||||
- Réponses:
|
||||
- Succès: `type`: `PAIRING_CREATED`, `pairingId`: string, `messageId`
|
||||
- Erreur: `ERROR`
|
||||
|
||||
### GET_PAIRING_ID (Requête)
|
||||
- Objet: récupérer l’identifiant d’appairage utilisateur.
|
||||
- Pré-requis: appairé + `accessToken` valide.
|
||||
- Requête: `type`, `accessToken`, `messageId`
|
||||
- Réponse: `type`: `GET_PAIRING_ID`, `userPairingId`: string, `messageId`
|
||||
|
||||
---
|
||||
|
||||
### GET_MY_PROCESSES (Requête)
|
||||
- Objet: lister les processus auxquels l’utilisateur participe.
|
||||
- Pré-requis: appairé + `accessToken` valide.
|
||||
- Requête: `type`, `accessToken`, `messageId`
|
||||
- Réponse: `type`: `GET_MY_PROCESSES`, `myProcesses`: string[] | null, `messageId`
|
||||
|
||||
### GET_PROCESSES (Requête)
|
||||
- Objet: récupérer tous les processus connus localement.
|
||||
- Pré-requis: appairé + `accessToken` valide.
|
||||
- Requête: `type`, `accessToken`, `messageId`
|
||||
- Réponse: `type`: `PROCESSES_RETRIEVED`, `processes`: Record<string, Process>, `messageId`
|
||||
|
||||
---
|
||||
|
||||
### RETRIEVE_DATA (Requête)
|
||||
- Objet: déchiffrer et retourner les attributs autorisés d’un état de processus.
|
||||
- Pré-requis: appairé + `accessToken` valide.
|
||||
- Requête: `type`, `processId`: string, `stateId`: string (32 bytes hex), `accessToken`, `messageId`
|
||||
- Réponse: `type`: `DATA_RETRIEVED`, `data`: Record<string, any>, `messageId`
|
||||
|
||||
### DECODE_PUBLIC_DATA (Requête)
|
||||
- Objet: décoder des données publiques encodées.
|
||||
- Pré-requis: appairé + `accessToken` valide.
|
||||
- Requête: `type`, `accessToken`, `encodedData`: number[], `messageId`
|
||||
- Réponse: `type`: `PUBLIC_DATA_DECODED`, `decodedData`: any, `messageId`
|
||||
|
||||
---
|
||||
|
||||
### CREATE_PROCESS (Requête)
|
||||
- Objet: créer un nouveau processus.
|
||||
- Pré-requis: appairé + `accessToken` valide.
|
||||
- Requête:
|
||||
- `type`
|
||||
- `processData`: Record<string, any> (données brutes à répartir en public/privé)
|
||||
- `privateFields`: string[] (liste des nouveaux champs à forcer en privé)
|
||||
- `roles`: Record<string, RoleDefinition>
|
||||
- `accessToken`, `messageId`
|
||||
- Réponse succès: `type`: `PROCESS_CREATED`, `processCreated`: { `processId`: string, `process`: Process, `processData`: Record<string, any> }, `messageId`
|
||||
- Réponse erreur: `ERROR`
|
||||
|
||||
### UPDATE_PROCESS (Requête)
|
||||
- Objet: créer un nouvel état avec des mises à jour (champs publics/privés déterminés automatiquement, `privateFields` pour les nouveaux champs privés).
|
||||
- Pré-requis: appairé + `accessToken` valide + processus existant avec état committé.
|
||||
- Requête: `type`, `processId`, `newData`: Record<string, any>, `privateFields`: string[], `roles` (ou null pour conserver), `accessToken`, `messageId`
|
||||
- Réponse: `type`: `PROCESS_UPDATED`, `updatedProcess`: Process, `messageId`
|
||||
|
||||
---
|
||||
|
||||
### NOTIFY_UPDATE (Requête)
|
||||
- Objet: demander l’émission d’un PRD Update pour un état précis.
|
||||
- Pré-requis: appairé + `accessToken` valide.
|
||||
- Requête: `type`, `processId`, `stateId` (32 bytes hex), `accessToken`, `messageId`
|
||||
- Réponse: `type`: `UPDATE_NOTIFIED`, `messageId`
|
||||
|
||||
### VALIDATE_STATE (Requête)
|
||||
- Objet: valider un état (selon règles/permissions WASM).
|
||||
- Pré-requis: appairé + `accessToken` valide.
|
||||
- Requête: `type`, `processId`, `stateId` (32 bytes hex), `accessToken`, `messageId`
|
||||
- Réponse: `type`: `STATE_VALIDATED`, `validatedProcess`: Process, `messageId`
|
||||
|
||||
---
|
||||
|
||||
### HASH_VALUE (Requête)
|
||||
- Objet: obtenir le hash d’un blob (document) pour un engagement donné.
|
||||
- Requête: `type`, `accessToken`, `commitedIn`: string, `label`: string, `fileBlob`: { type: string; data: Uint8Array }, `messageId`
|
||||
- Réponse: `type`: `VALUE_HASHED`, `hash`: string, `messageId`
|
||||
|
||||
### GET_MERKLE_PROOF (Requête)
|
||||
- Objet: récupérer la preuve Merkle d’un attribut dans un état.
|
||||
- Requête: `type`, `accessToken`, `processState`: ProcessState, `attributeName`: string, `messageId`
|
||||
- Réponse: `type`: `MERKLE_PROOF_RETRIEVED`, `proof`: MerkleProofResult, `messageId`
|
||||
|
||||
### VALIDATE_MERKLE_PROOF (Requête)
|
||||
- Objet: valider une preuve Merkle pour un document donné.
|
||||
- Requête: `type`, `accessToken`, `merkleProof`: string (JSON sérialisé), `documentHash`: string, `messageId`
|
||||
- Réponse: `type`: `MERKLE_PROOF_VALIDATED`, `isValid`: boolean, `messageId`
|
||||
|
||||
---
|
||||
|
||||
## Erreurs communes (`ERROR`)
|
||||
- Conditions typiques:
|
||||
- `Device not paired` (opération nécessitant appairage)
|
||||
- `Invalid or expired session token`
|
||||
- `Failed to ...` (création/lecture/validation)
|
||||
- `Invalid state id` / `Process not found`
|
||||
- Payload générique: `{ type: 'ERROR', error: string, messageId?: string }`
|
||||
|
||||
## Bonnes pratiques d’intégration
|
||||
- Toujours préciser et propager `messageId` pour tracer les échanges.
|
||||
- Conserver `origin` côté parent et utiliser la même valeur dans les requêtes suivantes.
|
||||
- Renouveler régulièrement le `accessToken` via `RENEW_TOKEN`.
|
||||
- Séparer données publiques/privées dès la création d’un processus.
|
||||
- Valider les formats (ids hex 32 bytes, structures de rôles) avant envoi.
|
8
docs/OPEN_SOURCE_CHECKLIST.md
Normal file
8
docs/OPEN_SOURCE_CHECKLIST.md
Normal file
@ -0,0 +1,8 @@
|
||||
# Checklist open source - ihm_client
|
||||
|
||||
- Licence présente et valide (LICENSE)
|
||||
- Code de conduite (CODE_OF_CONDUCT.md)
|
||||
- Guide de contribution (CONTRIBUTING.md)
|
||||
- CI/CD documentée
|
||||
- Documentation technique et utilisateur à jour
|
||||
- Aucune donnée sensible dans le dépôt
|
5
docs/QUICK_REFERENCE.md
Normal file
5
docs/QUICK_REFERENCE.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Référence rapide - ihm_client
|
||||
|
||||
- Commandes: install, dev, build, test, test:e2e
|
||||
- Dossiers clés: src/, pkg/, docs/
|
||||
- URLs: dev 3003, app servi par 4NK_node (artefacts dist/)
|
5
docs/RELEASE_PLAN.md
Normal file
5
docs/RELEASE_PLAN.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Plan de release - ihm_client
|
||||
|
||||
- Phases: préparation, RC, GA
|
||||
- Critères: tests verts, docs à jour, audit dépendances
|
||||
- Communication: notes de version, changelog, guide de migration
|
8
docs/ROADMAP.md
Normal file
8
docs/ROADMAP.md
Normal file
@ -0,0 +1,8 @@
|
||||
- [ ] Handshake iframe robuste (READY → LISTENING → REQUEST_LINK) avec ACKs
|
||||
- Objectif: éliminer les conditions de course à l’initialisation
|
||||
- Détails: séquence explicite, timeouts, retry backoff
|
||||
# Roadmap - ihm_client
|
||||
|
||||
- Court terme: stabilisation iframe, optimisation WASM
|
||||
- Moyen terme: E2E tests, PWA, performances
|
||||
- Long terme: analytics, nouvelles intégrations
|
25
docs/SECURITY_AUDIT.md
Normal file
25
docs/SECURITY_AUDIT.md
Normal file
@ -0,0 +1,25 @@
|
||||
# Audit de sécurité - ihm_client
|
||||
|
||||
Ce document synthétise la posture de sécurité, les contrôles, et les axes d’audit pour `ihm_client`.
|
||||
|
||||
## Portée
|
||||
- Surface frontend (TypeScript, Vite, dépendances npm)
|
||||
- Intégration WASM (sdk_client)
|
||||
- Messagerie iframe (`postMessage`) avec sites hôtes
|
||||
|
||||
## Contrôles actuels
|
||||
- Validation et renouvellement de tokens de session liés à l’origine appelante
|
||||
- Isolation des données privées (déchiffrement conditionné, clés requises)
|
||||
- Aucune exposition de secrets runtime dans le code
|
||||
|
||||
## Axes d’audit
|
||||
- Dépendances: revue `npm audit`, vérification des transitive deps
|
||||
- WASM: taille, init sécurisé, absence d’APIs dangereuses
|
||||
- Iframe: vérification stricte des `origin`, absence d’élévation via messages
|
||||
|
||||
## Vulnérabilités connues
|
||||
- Aucune critique ouverte à date
|
||||
|
||||
## Plan de remédiation
|
||||
- Mise à jour régulière des dépendances
|
||||
- Tests de sécurité ciblés côté messagerie et décodage de données
|
322
docs/SSH_USAGE.md
Normal file
322
docs/SSH_USAGE.md
Normal file
@ -0,0 +1,322 @@
|
||||
# Documentation SSH complète - ihm_client
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Ce document consolide toute la documentation SSH pour le projet `ihm_client`, couvrant l'automatisation des push, la configuration CI/CD, et les bonnes pratiques de sécurité.
|
||||
|
||||
## Table des matières
|
||||
|
||||
- [Configuration automatique](#configuration-automatique)
|
||||
- [Scripts d'automatisation](#scripts-dautomatisation)
|
||||
- [Workflow CI/CD](#workflow-cicd)
|
||||
- [Alias Git](#alias-git)
|
||||
- [Bonnes pratiques](#bonnes-pratiques)
|
||||
- [Dépannage](#dépannage)
|
||||
|
||||
---
|
||||
|
||||
## Configuration automatique
|
||||
|
||||
### Configuration Git globale
|
||||
|
||||
La configuration SSH est automatiquement appliquée pour tous les push :
|
||||
|
||||
```bash
|
||||
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||
```
|
||||
|
||||
### Vérification SSH
|
||||
|
||||
Test automatique de la connexion SSH :
|
||||
|
||||
```bash
|
||||
ssh -T git@git.4nkweb.com
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Scripts d'automatisation
|
||||
|
||||
### 1. Script principal : `auto-ssh-push.sh`
|
||||
|
||||
Le script `scripts/auto-ssh-push.sh` offre plusieurs modes de push automatique :
|
||||
|
||||
#### Options disponibles
|
||||
|
||||
```bash
|
||||
# Push rapide (message automatique)
|
||||
./scripts/auto-ssh-push.sh quick
|
||||
|
||||
# Push avec message personnalisé
|
||||
./scripts/auto-ssh-push.sh message "feat: nouvelle fonctionnalité"
|
||||
|
||||
# Push sur une branche spécifique
|
||||
./scripts/auto-ssh-push.sh branch feature/nouvelle-fonctionnalite
|
||||
|
||||
# Push et merge (avec confirmation)
|
||||
./scripts/auto-ssh-push.sh merge
|
||||
|
||||
# Vérification du statut
|
||||
./scripts/auto-ssh-push.sh status
|
||||
```
|
||||
|
||||
#### Fonctionnalités
|
||||
|
||||
- **Configuration SSH automatique** - Plus besoin de configurer SSH manuellement
|
||||
- **Push automatique** - Ajout, commit et push en une commande
|
||||
- **Gestion des branches** - Support des branches personnalisées
|
||||
- **Vérification SSH** - Test automatique de la connexion SSH
|
||||
- **Messages de commit** - Messages automatiques ou personnalisés
|
||||
|
||||
### 2. Script d'initialisation : `init-ssh-env.sh`
|
||||
|
||||
Le script `scripts/init-ssh-env.sh` configure automatiquement l'environnement SSH :
|
||||
|
||||
```bash
|
||||
./scripts/init-ssh-env.sh
|
||||
```
|
||||
|
||||
#### Fonctionnalités
|
||||
|
||||
- Vérification de l'environnement de développement
|
||||
- Configuration SSH automatique
|
||||
- Test de connectivité SSH
|
||||
- Configuration des alias Git
|
||||
- Validation de la configuration
|
||||
|
||||
### 3. Script CI/CD : `setup-ssh-ci.sh`
|
||||
|
||||
Le script `scripts/setup-ssh-ci.sh` configure SSH pour les environnements CI/CD :
|
||||
|
||||
```bash
|
||||
./scripts/setup-ssh-ci.sh
|
||||
```
|
||||
|
||||
#### Fonctionnalités
|
||||
|
||||
- Détection automatique de l'environnement CI
|
||||
- Configuration SSH pour Gitea Actions
|
||||
- Gestion des clés SSH privées
|
||||
- Test de connexion SSH
|
||||
- Configuration Git pour SSH
|
||||
|
||||
---
|
||||
|
||||
## Workflow CI/CD
|
||||
|
||||
### Configuration Gitea Actions
|
||||
|
||||
Le workflow CI/CD dans `.gitea/workflows/ci.yml` inclut une étape de configuration SSH :
|
||||
|
||||
```yaml
|
||||
- name: Setup SSH for Gitea
|
||||
run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
|
||||
chmod 600 ~/.ssh/id_rsa
|
||||
ssh-keyscan -H git.4nkweb.com >> ~/.ssh/known_hosts
|
||||
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||
```
|
||||
|
||||
### Variables d'environnement requises
|
||||
|
||||
- `SSH_PRIVATE_KEY` : Clé SSH privée pour l'authentification
|
||||
- `SSH_PUBLIC_KEY` : Clé SSH publique (optionnelle)
|
||||
|
||||
### Jobs configurés
|
||||
|
||||
- **test** : Tests unitaires et d'intégration
|
||||
- **security** : Tests de sécurité et audit
|
||||
- **integration-test** : Tests d'intégration complets
|
||||
|
||||
---
|
||||
|
||||
## Alias Git
|
||||
|
||||
### Alias configurés
|
||||
|
||||
```bash
|
||||
# Push rapide avec message automatique
|
||||
git quick-push
|
||||
|
||||
# Push avec message personnalisé
|
||||
git ssh-push "Mon message de commit"
|
||||
```
|
||||
|
||||
### Configuration des alias
|
||||
|
||||
```bash
|
||||
# Alias pour push rapide
|
||||
git config --global alias.quick-push '!f() { git add . && git commit -m "Update $(date)" && git push origin $(git branch --show-current); }; f'
|
||||
|
||||
# Alias pour push avec message
|
||||
git config --global alias.ssh-push '!f() { git add . && git commit -m "${1:-Auto-commit $(date)}" && git push origin $(git branch --show-current); }; f'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Bonnes pratiques
|
||||
|
||||
### Sécurité
|
||||
|
||||
1. **Permissions des clés SSH**
|
||||
```bash
|
||||
chmod 600 ~/.ssh/id_rsa
|
||||
chmod 644 ~/.ssh/id_rsa.pub
|
||||
chmod 600 ~/.ssh/config
|
||||
```
|
||||
|
||||
2. **Configuration SSH sécurisée**
|
||||
```bash
|
||||
Host git.4nkweb.com
|
||||
HostName git.4nkweb.com
|
||||
User git
|
||||
IdentityFile ~/.ssh/id_rsa
|
||||
StrictHostKeyChecking no
|
||||
UserKnownHostsFile=/dev/null
|
||||
```
|
||||
|
||||
3. **Gestion des secrets**
|
||||
- Ne jamais commiter de clés SSH dans le code
|
||||
- Utiliser les secrets Gitea pour les clés privées
|
||||
- Rotation régulière des clés SSH
|
||||
|
||||
### Workflow recommandé
|
||||
|
||||
1. **Initialisation**
|
||||
```bash
|
||||
./scripts/init-ssh-env.sh
|
||||
```
|
||||
|
||||
2. **Développement quotidien**
|
||||
```bash
|
||||
# Push rapide
|
||||
./scripts/auto-ssh-push.sh quick
|
||||
|
||||
# Ou avec alias Git
|
||||
git quick-push
|
||||
```
|
||||
|
||||
3. **Push avec message**
|
||||
```bash
|
||||
./scripts/auto-ssh-push.sh message "feat: nouvelle fonctionnalité"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dépannage
|
||||
|
||||
### Problèmes courants
|
||||
|
||||
#### 1. Échec d'authentification SSH
|
||||
|
||||
```bash
|
||||
# Vérifier la configuration SSH
|
||||
ssh -T git@git.4nkweb.com
|
||||
|
||||
# Vérifier les permissions
|
||||
ls -la ~/.ssh/
|
||||
|
||||
# Régénérer la clé SSH si nécessaire
|
||||
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_4nk
|
||||
```
|
||||
|
||||
#### 2. Configuration Git incorrecte
|
||||
|
||||
```bash
|
||||
# Vérifier la configuration Git
|
||||
git config --global --list | grep url
|
||||
|
||||
# Reconfigurer SSH
|
||||
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||
```
|
||||
|
||||
#### 3. Problèmes CI/CD
|
||||
|
||||
```bash
|
||||
# Vérifier les variables d'environnement
|
||||
echo $SSH_PRIVATE_KEY
|
||||
|
||||
# Tester la configuration SSH
|
||||
./scripts/setup-ssh-ci.sh
|
||||
```
|
||||
|
||||
### Messages d'erreur courants
|
||||
|
||||
- **"Permission denied"** : Vérifier les permissions des clés SSH
|
||||
- **"Host key verification failed"** : Ajouter l'hôte aux known_hosts
|
||||
- **"Could not resolve hostname"** : Vérifier la connectivité réseau
|
||||
|
||||
### Logs et debugging
|
||||
|
||||
```bash
|
||||
# Activer le debug SSH
|
||||
ssh -vT git@git.4nkweb.com
|
||||
|
||||
# Vérifier les logs Git
|
||||
GIT_SSH_COMMAND="ssh -v" git push origin main
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Intégration avec 4NK_node
|
||||
|
||||
### Configuration pour l'intégration
|
||||
|
||||
Le projet `ihm_client` est configuré pour s'intégrer dans l'infrastructure `4NK_node` :
|
||||
|
||||
1. **Script d'intégration** : `scripts/integrate-4nk-node.sh`
|
||||
2. **Configuration Docker** : `Dockerfile.4nk-node`
|
||||
3. **Configuration Nginx** : gérée dans `4NK_node` (consommation de `dist/`)
|
||||
4. **Script de démarrage** : `start-4nk-node.sh`
|
||||
|
||||
### Workflow d'intégration
|
||||
|
||||
```bash
|
||||
# Intégrer ihm_client dans 4NK_node
|
||||
./scripts/integrate-4nk-node.sh
|
||||
|
||||
# Vérifier l'intégration
|
||||
docker-compose -f docker-compose.4nk-node.yml up -d
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Évolution future
|
||||
|
||||
### Améliorations prévues
|
||||
|
||||
1. **Support multi-environnements**
|
||||
- Configuration automatique pour différents environnements
|
||||
- Gestion des clés SSH multiples
|
||||
|
||||
2. **Intégration avancée**
|
||||
- Support des hooks Git
|
||||
- Intégration avec d'autres outils CI/CD
|
||||
|
||||
3. **Sécurité renforcée**
|
||||
- Support des clés SSH temporaires
|
||||
- Audit automatique des permissions
|
||||
|
||||
### Maintenance
|
||||
|
||||
- Vérification régulière de la configuration SSH
|
||||
- Mise à jour des scripts d'automatisation
|
||||
- Documentation des nouvelles fonctionnalités
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
L'automatisation SSH pour `ihm_client` simplifie considérablement le workflow de développement en éliminant la nécessité de configurer manuellement SSH pour chaque opération Git. Les scripts et alias fournis offrent une interface simple et sécurisée pour tous les push vers le repository.
|
||||
|
||||
### Ressources
|
||||
|
||||
- [Documentation SSH officielle](https://git-scm.com/book/fr/v2/Git-sur-le-serveur-Génération-d-une-clé-SSH)
|
||||
- [Guide Gitea SSH](https://docs.gitea.com/usage/ssh-setup)
|
||||
- [Bonnes pratiques SSH](https://www.ssh.com/academy/ssh/key)
|
||||
|
||||
---
|
||||
|
||||
**Dernière mise à jour** : $(date '+%Y-%m-%d')
|
||||
**Version** : 1.0.0
|
51
docs/TESTING.md
Normal file
51
docs/TESTING.md
Normal file
@ -0,0 +1,51 @@
|
||||
# Tests - ihm_client
|
||||
|
||||
Cette page décrit la stratégie de test, l’outillage et les conventions. Aucun exemple exécutable n’est inclus.
|
||||
|
||||
## Périmètre et objectifs
|
||||
|
||||
- Couverture des utilitaires (hex/binaire, DOM, adresses → emojis).
|
||||
- Couverture des services isolables (`TokenService`).
|
||||
- Non-régression des conversions et des invariants d’API.
|
||||
|
||||
## Outils
|
||||
|
||||
- Test runner: Jest 29 (environnement `jsdom`).
|
||||
- TypeScript: `ts-jest` (transform TS).
|
||||
- Setup global: `tests/setup.ts` (polyfills Web, mocks réseau et stockage).
|
||||
- E2E: Playwright (Chromium headless) avec `playwright.config.ts`.
|
||||
|
||||
## Organisation
|
||||
|
||||
- `tests/unit/` : tests unitaires ciblés, rapides.
|
||||
- `tests/integration/` : réservé aux interactions WASM/services (à compléter si besoin).
|
||||
- `tests/e2e/` : tests de bout en bout (smoke tests).
|
||||
|
||||
## Exécution
|
||||
|
||||
- Lancer tous les tests: `npm run test`
|
||||
- Couverture: `npm run test:coverage`
|
||||
- Veille interactive: `npm run test:watch`
|
||||
- E2E: `npm run e2e:install` puis `npm run test:e2e`
|
||||
|
||||
## Conventions
|
||||
|
||||
- Un test = un invariant métier/technique.
|
||||
- Mocks minimaux, privilégier l’isolation des dépendances (ex. `jose` mocké).
|
||||
- Aucun exemple de code applicatif dans la documentation.
|
||||
|
||||
## Polyfills et mocks de test
|
||||
|
||||
- `TextEncoder`/`TextDecoder` via `util`.
|
||||
- `crypto.subtle.digest` faux pour hashing déterministe en test d’emojis.
|
||||
- `fetch`, `WebSocket`, `localStorage`, `sessionStorage` mockés.
|
||||
|
||||
## Critères d’acceptation
|
||||
|
||||
- 100% vert sur la suite unitaire.
|
||||
- Build TypeScript OK (`npm run build:dist`) avant commit.
|
||||
|
||||
## Rapports
|
||||
|
||||
- Rapport couverture: `coverage/` (text, lcov, html).
|
||||
- Logs de tests: sortie Jest standard.
|
423
docs/USAGE.md
Normal file
423
docs/USAGE.md
Normal file
@ -0,0 +1,423 @@
|
||||
# 📖 Guide d'Utilisation - ihm_client
|
||||
|
||||
Guide complet pour utiliser l'interface utilisateur ihm_client au quotidien.
|
||||
|
||||
## 🚀 Démarrage Rapide
|
||||
|
||||
### Démarrage du Serveur de Développement
|
||||
|
||||
```bash
|
||||
# Démarrer le serveur de développement
|
||||
npm run dev
|
||||
|
||||
# Le serveur démarre sur http://localhost:3000
|
||||
# Hot reload activé pour le développement
|
||||
```
|
||||
|
||||
### Accès à l'Interface
|
||||
|
||||
1. **Ouvrir le navigateur** : http://localhost:3000
|
||||
2. **Page d'accueil** : Vue d'ensemble et navigation
|
||||
3. **Connexion** : Via adresse device ou QR code
|
||||
|
||||
## 🏠 Page d'Accueil
|
||||
|
||||
### Navigation Principale
|
||||
|
||||
- **🏠 Accueil** - Vue d'ensemble et navigation
|
||||
- **👤 Compte** - Gestion du profil utilisateur
|
||||
|
||||
### Tableau de Bord
|
||||
|
||||
- **Statistiques personnelles** : Processus actifs, documents signés
|
||||
- **Notifications récentes** : Alertes et mises à jour
|
||||
- **Actions rapides** : Créer un processus, scanner QR code
|
||||
- **État du wallet** : Solde et transactions récentes
|
||||
|
||||
## 👤 Gestion du Compte
|
||||
|
||||
### Profil Utilisateur
|
||||
|
||||
#### Accès au Profil
|
||||
1. Cliquer sur la bulle de profil en haut à gauche
|
||||
2. Popup de profil s'ouvre avec les informations personnelles
|
||||
|
||||
#### Informations Modifiables
|
||||
- **Nom et prénom** : Éditer directement dans les champs
|
||||
- **Photo de profil** : Cliquer pour changer l'image
|
||||
- **Email** : Adresse de contact (lecture seule)
|
||||
- **Adresse device** : Identifiant unique (lecture seule)
|
||||
|
||||
#### Actions du Profil
|
||||
|
||||
##### Export User Data
|
||||
```bash
|
||||
# Génère un fichier JSON avec toutes les données utilisateur
|
||||
# Inclut : profil, processus, documents, wallet
|
||||
```
|
||||
|
||||
##### Export Recovery
|
||||
```bash
|
||||
# Génère les 4 mots de récupération
|
||||
# IMPORTANT : Noter et conserver en lieu sûr
|
||||
# Le bouton devient inaccessible après utilisation
|
||||
```
|
||||
|
||||
##### Delete Account
|
||||
```bash
|
||||
# Supprime définitivement le compte
|
||||
# Demande de confirmation obligatoire
|
||||
# Action irréversible
|
||||
```
|
||||
|
||||
##### Logout
|
||||
```bash
|
||||
# Déconnexion de l'interface
|
||||
# Retour à la page de connexion
|
||||
```
|
||||
|
||||
### Onglet Pairing
|
||||
|
||||
#### Ajouter un Device
|
||||
1. Cliquer sur "Add Device"
|
||||
2. Choisir la méthode :
|
||||
- **Scanner QR Code** : Scanner le code d'un autre device
|
||||
- **Saisir manuellement** : Entrer l'adresse device
|
||||
|
||||
#### Gérer les Devices
|
||||
- **Renommer** : Cliquer sur le nom pour l'éditer
|
||||
- **Supprimer** : Cliquer sur l'icône poubelle
|
||||
- **Statut** : En ligne/hors ligne
|
||||
|
||||
#### Scanner QR Code
|
||||
1. Cliquer sur "Scan QR Code"
|
||||
2. Autoriser l'accès à la caméra
|
||||
3. Pointer vers le QR code
|
||||
4. Confirmation automatique
|
||||
|
||||
### Onglet Wallet
|
||||
|
||||
#### Gestion des Wallets
|
||||
- **Voir le solde** : Affichage en temps réel
|
||||
- **Ajouter une ligne** : Nouveau wallet Silent Payment
|
||||
- **Historique** : Transactions récentes
|
||||
- **Détails** : Cliquer pour plus d'informations
|
||||
|
||||
#### Opérations Wallet
|
||||
```bash
|
||||
# Générer un nouveau wallet
|
||||
generate_sp_wallet()
|
||||
|
||||
# Verrouiller des UTXOs
|
||||
lock_freezed_utxos(wallet, utxos)
|
||||
|
||||
# Scanner des blocs
|
||||
scan_blocks(wallet, blocks)
|
||||
```
|
||||
|
||||
### Onglet Process
|
||||
|
||||
#### Processus Disponibles
|
||||
- **Liste des processus** : Tous les processus accessibles
|
||||
- **Notifications** : Cliquer sur la sonnette pour voir les alertes
|
||||
- **Statut** : Actif, en attente, terminé
|
||||
- **Actions** : Voir, modifier, supprimer
|
||||
|
||||
#### Créer un Processus
|
||||
1. Cliquer sur "Nouveau Processus"
|
||||
2. Remplir les informations :
|
||||
- **Nom** : Nom du processus
|
||||
- **Description** : Détails du processus
|
||||
- **Membres** : Ajouter des participants
|
||||
- **Rôles** : Définir les responsabilités
|
||||
3. Valider la création
|
||||
|
||||
### Onglet Data
|
||||
|
||||
#### Données Importées
|
||||
- **Liste des données** : Fichiers JSON importés
|
||||
- **Contrats associés** : Cliquer pour voir le contrat
|
||||
- **Statut** : Validé, en cours, rejeté
|
||||
- **Actions** : Voir, modifier, supprimer
|
||||
|
||||
## 📄 Gestion des Processus
|
||||
|
||||
### Vue d'Ensemble
|
||||
|
||||
#### Onglets du Processus
|
||||
- **📋 Informations** : Détails du processus
|
||||
- **👥 Membres** : Participants et rôles
|
||||
- **📁 Documents** : Fichiers associés
|
||||
- **✍️ Signatures** : Demandes de signature
|
||||
- **💬 Chat** : Communication interne
|
||||
|
||||
### Gestion des Membres
|
||||
|
||||
#### Ajouter un Membre
|
||||
1. Cliquer sur "Ajouter Membre"
|
||||
2. Choisir la méthode :
|
||||
- **Scanner QR Code** : Invitation directe
|
||||
- **Envoyer un lien** : Lien d'invitation
|
||||
- **Saisir l'adresse** : Adresse device manuelle
|
||||
|
||||
#### Assigner des Rôles
|
||||
1. Sélectionner un membre
|
||||
2. Cliquer sur "Assigner Rôle"
|
||||
3. Choisir le rôle :
|
||||
- **Admin** : Gestion complète
|
||||
- **Signataire** : Peut signer des documents
|
||||
- **Lecteur** : Lecture seule
|
||||
- **Custom** : Rôle personnalisé
|
||||
|
||||
### Gestion des Documents
|
||||
|
||||
#### Importer un Document
|
||||
1. Cliquer sur "Importer Document"
|
||||
2. Choisir le fichier (PDF, DOC, etc.)
|
||||
3. Remplir les métadonnées :
|
||||
- **Nom** : Nom du document
|
||||
- **Description** : Détails du document
|
||||
- **Rôles requis** : Qui doit signer
|
||||
4. Valider l'import
|
||||
|
||||
#### Organiser les Documents
|
||||
- **Dossiers** : Créer des dossiers pour organiser
|
||||
- **Tags** : Ajouter des étiquettes
|
||||
- **Recherche** : Filtrer par nom, type, statut
|
||||
- **Tri** : Par date, nom, taille
|
||||
|
||||
## ✍️ Système de Signatures
|
||||
|
||||
### Demandes de Signature
|
||||
|
||||
#### Créer une Demande
|
||||
1. Aller dans l'onglet "Signatures"
|
||||
2. Cliquer sur "Nouvelle Demande"
|
||||
3. Remplir les informations :
|
||||
- **Document** : Sélectionner le document
|
||||
- **Signataires** : Choisir les participants
|
||||
- **Description** : Détails de la demande
|
||||
- **Date limite** : Échéance de signature
|
||||
- **Visibilité** : Publique ou privée
|
||||
4. Valider la création
|
||||
|
||||
#### Gérer les Demandes
|
||||
- **En attente** : Demandes non signées
|
||||
- **Signées** : Demandes complétées
|
||||
- **Expirées** : Demandes dépassées
|
||||
- **Actions** : Voir, modifier, annuler
|
||||
|
||||
### Signer un Document
|
||||
|
||||
#### Processus de Signature
|
||||
1. Recevoir une notification de demande
|
||||
2. Cliquer sur "Voir la demande"
|
||||
3. Prévisualiser le document
|
||||
4. Cliquer sur "Signer"
|
||||
5. Confirmer la signature
|
||||
|
||||
#### Types de Signature
|
||||
- **Signature électronique** : Signature numérique
|
||||
- **Signature biométrique** : Empreinte digitale
|
||||
- **Signature par mot de passe** : Code secret
|
||||
|
||||
## 💬 Système de Chat
|
||||
|
||||
### Communication Interne
|
||||
|
||||
#### Accès au Chat
|
||||
1. Aller dans l'onglet "Chat"
|
||||
2. Sélectionner le processus
|
||||
3. Voir les conversations
|
||||
|
||||
#### Envoyer un Message
|
||||
1. Sélectionner un utilisateur ou groupe
|
||||
2. Taper le message
|
||||
3. Cliquer sur "Envoyer"
|
||||
|
||||
#### Types de Messages
|
||||
- **Texte** : Messages simples
|
||||
- **Documents** : Fichiers partagés
|
||||
- **Images** : Captures d'écran
|
||||
- **Liens** : URLs partagées
|
||||
|
||||
### Notifications
|
||||
|
||||
#### Types de Notifications
|
||||
- **Messages** : Nouveaux messages reçus
|
||||
- **Signatures** : Demandes de signature
|
||||
- **Processus** : Mises à jour de processus
|
||||
- **Système** : Alertes système
|
||||
|
||||
#### Gestion des Notifications
|
||||
- **Marquer comme lu** : Cliquer sur la notification
|
||||
- **Répondre** : Répondre directement
|
||||
- **Ignorer** : Masquer la notification
|
||||
- **Paramètres** : Configurer les alertes
|
||||
|
||||
## 🔗 Système de Pairing
|
||||
|
||||
### Connexion avec d'Autres Utilisateurs
|
||||
|
||||
#### Méthodes de Pairing
|
||||
1. **QR Code** : Scanner le code d'un autre device
|
||||
2. **Lien d'invitation** : Envoyer un lien
|
||||
3. **Adresse manuelle** : Saisir l'adresse device
|
||||
|
||||
#### Processus de Pairing
|
||||
1. **Initiative** : Un utilisateur initie la connexion
|
||||
2. **Confirmation** : L'autre utilisateur confirme
|
||||
3. **Établissement** : La connexion est établie
|
||||
4. **Vérification** : Test de communication
|
||||
|
||||
#### Gestion des Connexions
|
||||
- **Connexions actives** : Devices connectés
|
||||
- **Demandes en attente** : Invitations non acceptées
|
||||
- **Historique** : Connexions passées
|
||||
- **Actions** : Déconnecter, renommer, supprimer
|
||||
|
||||
## 🔔 Notifications et Alertes
|
||||
|
||||
### Centre de Notifications
|
||||
|
||||
#### Accès aux Notifications
|
||||
- **Icône cloche** : En haut à droite
|
||||
- **Compteur** : Nombre de notifications non lues
|
||||
- **Liste** : Toutes les notifications
|
||||
|
||||
#### Types d'Alertes
|
||||
- **Urgentes** : Rouge, action immédiate requise
|
||||
- **Importantes** : Orange, attention requise
|
||||
- **Informatives** : Bleu, information générale
|
||||
- **Succès** : Vert, confirmation d'action
|
||||
|
||||
### Configuration des Notifications
|
||||
|
||||
#### Paramètres
|
||||
1. Aller dans "Paramètres" > "Notifications"
|
||||
2. Configurer par type :
|
||||
- **Messages** : Notifications de chat
|
||||
- **Signatures** : Demandes de signature
|
||||
- **Processus** : Mises à jour
|
||||
- **Système** : Alertes système
|
||||
|
||||
#### Préférences
|
||||
- **Son** : Activer/désactiver les sons
|
||||
- **Pop-up** : Notifications en pop-up
|
||||
- **Email** : Notifications par email
|
||||
- **Push** : Notifications push (si supporté)
|
||||
|
||||
## 🛠️ Fonctionnalités Avancées
|
||||
|
||||
### Recherche Globale
|
||||
|
||||
#### Utilisation
|
||||
1. Cliquer sur l'icône de recherche
|
||||
2. Taper le terme recherché
|
||||
3. Voir les résultats :
|
||||
- **Processus** : Processus correspondants
|
||||
- **Documents** : Documents correspondants
|
||||
- **Messages** : Messages correspondants
|
||||
- **Utilisateurs** : Utilisateurs correspondants
|
||||
|
||||
### Filtres et Tri
|
||||
|
||||
#### Filtres Disponibles
|
||||
- **Date** : Filtrer par période
|
||||
- **Type** : Filtrer par type de contenu
|
||||
- **Statut** : Filtrer par statut
|
||||
- **Utilisateur** : Filtrer par utilisateur
|
||||
|
||||
#### Options de Tri
|
||||
- **Date** : Plus récent/ancien
|
||||
- **Nom** : Alphabétique
|
||||
- **Taille** : Plus grand/petit
|
||||
- **Statut** : Priorité des statuts
|
||||
|
||||
### Export et Sauvegarde
|
||||
|
||||
#### Exporter des Données
|
||||
```bash
|
||||
# Export complet du profil
|
||||
Export User Data > JSON
|
||||
|
||||
# Export des processus
|
||||
Processus > Exporter > CSV
|
||||
|
||||
# Export des documents
|
||||
Documents > Exporter > ZIP
|
||||
```
|
||||
|
||||
#### Sauvegarde Automatique
|
||||
- **Sauvegarde locale** : Données stockées localement
|
||||
- **Synchronisation** : Synchronisation avec le serveur
|
||||
- **Récupération** : Restauration des données
|
||||
|
||||
## 🚨 Dépannage
|
||||
|
||||
### Problèmes Courants
|
||||
|
||||
#### Interface ne se charge pas
|
||||
```bash
|
||||
# Vérifier le serveur
|
||||
npm run dev
|
||||
|
||||
# Vérifier les logs
|
||||
npm run dev --verbose
|
||||
|
||||
# Nettoyer le cache
|
||||
npm run clean
|
||||
```
|
||||
|
||||
#### Module WASM non trouvé
|
||||
```bash
|
||||
# Recompiler le module WASM
|
||||
./scripts/setup-remote-deps.sh
|
||||
|
||||
# Vérifier le fichier
|
||||
ls -la pkg/sdk_client_bg.wasm
|
||||
```
|
||||
|
||||
#### Erreurs de connexion
|
||||
```bash
|
||||
# Vérifier les variables d'environnement
|
||||
cat .env
|
||||
|
||||
# Tester la connectivité
|
||||
npm run test:connectivity
|
||||
```
|
||||
|
||||
### Support Utilisateur
|
||||
|
||||
#### Obtenir de l'Aide
|
||||
1. **Documentation** : Consulter ce guide
|
||||
2. **FAQ** : Questions fréquentes
|
||||
3. **Support** : Contacter l'équipe
|
||||
4. **Issues** : Signaler un problème
|
||||
|
||||
#### Signaler un Bug
|
||||
1. Aller sur [Issues](https://git.4nkweb.com/4nk/ihm_client/issues)
|
||||
2. Créer une nouvelle issue
|
||||
3. Décrire le problème :
|
||||
- **Étapes** : Comment reproduire
|
||||
- **Comportement** : Ce qui se passe
|
||||
- **Attendu** : Ce qui devrait se passer
|
||||
- **Environnement** : OS, navigateur, version
|
||||
|
||||
## 📊 Métriques d'Utilisation
|
||||
|
||||
### Statistiques Personnelles
|
||||
- **Processus créés** : Nombre de processus
|
||||
- **Documents signés** : Nombre de signatures
|
||||
- **Messages envoyés** : Communication
|
||||
- **Temps d'utilisation** : Temps passé
|
||||
|
||||
### Performance
|
||||
- **Temps de chargement** : Vitesse de l'interface
|
||||
- **Temps de réponse** : Réactivité
|
||||
- **Utilisation mémoire** : Consommation RAM
|
||||
- **Taille des données** : Stockage utilisé
|
||||
|
||||
---
|
||||
|
||||
**🎯 Interface utilisateur ihm_client - Prête pour une utilisation quotidienne !** ✨
|
@ -6,7 +6,7 @@
|
||||
<meta name="description" content="4NK Web5 Platform">
|
||||
<meta name="keywords" content="4NK web5 bitcoin blockchain decentralize dapps relay contract">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="./style/4nk.css">
|
||||
<link rel="stylesheet" href="/style/4nk.css">
|
||||
<script src="https://unpkg.com/html5-qrcode"></script>
|
||||
<title>4NK Application</title>
|
||||
</head>
|
||||
|
34
jest.config.js
Normal file
34
jest.config.js
Normal file
@ -0,0 +1,34 @@
|
||||
module.exports = {
|
||||
preset: 'ts-jest',
|
||||
testEnvironment: 'jsdom',
|
||||
roots: ['<rootDir>/src', '<rootDir>/tests'],
|
||||
testMatch: [
|
||||
'**/__tests__/**/*.ts',
|
||||
'**/?(*.)+(spec|test).ts'
|
||||
],
|
||||
transform: {
|
||||
'^.+\\.ts$': 'ts-jest',
|
||||
},
|
||||
collectCoverageFrom: [
|
||||
'src/**/*.ts',
|
||||
'!src/**/*.d.ts',
|
||||
'!src/main.ts',
|
||||
'!src/vite-env.d.ts'
|
||||
],
|
||||
coverageDirectory: 'coverage',
|
||||
coverageReporters: ['text', 'lcov', 'html'],
|
||||
setupFilesAfterEnv: ['<rootDir>/tests/setup.ts'],
|
||||
moduleNameMapper: {
|
||||
'^@/(.*)$': '<rootDir>/src/$1',
|
||||
'^~/(.*)$': '<rootDir>/src/$1',
|
||||
'^pkg/(.*)$': '<rootDir>/pkg/$1',
|
||||
'^(.*)\\?raw$': '<rootDir>/tests/rawFileMock.js',
|
||||
'\\.(css|less|sass|scss)$': '<rootDir>/tests/styleMock.js'
|
||||
},
|
||||
testTimeout: 10000,
|
||||
transform: {
|
||||
'^.+\\.ts$': ['ts-jest', {
|
||||
tsconfig: 'tsconfig.json'
|
||||
}],
|
||||
}
|
||||
};
|
16
nginx.conf
Normal file
16
nginx.conf
Normal file
@ -0,0 +1,16 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|wasm)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
5352
package-lock.json
generated
5352
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
37
package.json
37
package.json
@ -1,43 +1,64 @@
|
||||
{
|
||||
"name": "sdk_client",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"description": "",
|
||||
"main": "dist/index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"build_wasm": "wasm-pack build --out-dir ../ihm_client_dev1/pkg ../sdk_client --target bundler --dev",
|
||||
"test": "jest",
|
||||
"test:watch": "jest --watch",
|
||||
"test:coverage": "jest --coverage",
|
||||
"test:unit": "jest --testPathPattern=tests/unit",
|
||||
"test:integration": "jest --testPathPattern=tests/integration",
|
||||
"build_wasm": "./scripts/setup-remote-deps.sh",
|
||||
"cleanup_deps": "./scripts/cleanup-deps.sh",
|
||||
"start": "vite --host 0.0.0.0",
|
||||
"build": "tsc && vite build",
|
||||
"deploy": "sudo cp -r dist/* /var/www/html/",
|
||||
"prettify": "prettier --config ./.prettierrc --write \"src/**/*{.ts,.html,.css,.js}\""
|
||||
"prettify": "prettier --config ./.prettierrc --write \"src/**/*{.ts,.html,.css,.js}\"",
|
||||
"build:dist": "tsc -p tsconfig.build.json",
|
||||
"lint": "prettier -c \"src/**/*{.ts,.html,.css,.js}\"",
|
||||
"type-check": "tsc -p tsconfig.json --noEmit",
|
||||
"e2e:install": "npx playwright install --with-deps",
|
||||
"test:e2e": "playwright test"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@rollup/plugin-typescript": "^12.1.1",
|
||||
"@types/jest": "^29.5.12",
|
||||
"@types/node": "^20.11.24",
|
||||
"@vitejs/plugin-vue": "^5.0.5",
|
||||
"copy-webpack-plugin": "^12.0.2",
|
||||
"html-webpack-plugin": "^5.6.0",
|
||||
"jest": "^29.7.0",
|
||||
"jest-environment-jsdom": "^29.7.0",
|
||||
"prettier": "^3.3.3",
|
||||
"rimraf": "^6.0.1",
|
||||
"ts-jest": "^29.1.2",
|
||||
"ts-loader": "^9.5.1",
|
||||
"typescript": "^5.3.3",
|
||||
"vite": "^5.4.11",
|
||||
"vite-plugin-static-copy": "^1.0.6",
|
||||
"webpack": "^5.90.3",
|
||||
"webpack-cli": "^5.1.4",
|
||||
"webpack-dev-server": "^5.0.2"
|
||||
"webpack-dev-server": "^5.0.2",
|
||||
"@playwright/test": "^1.46.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular/elements": "^19.0.1",
|
||||
"@types/jsonwebtoken": "^9.0.9",
|
||||
"@types/qrcode": "^1.5.5",
|
||||
"@vitejs/plugin-react": "^4.3.1",
|
||||
"@vitejs/plugin-vue": "^5.0.5",
|
||||
"axios": "^1.7.8",
|
||||
"axios": "^1.11.0",
|
||||
"html5-qrcode": "^2.3.8",
|
||||
"jose": "^6.0.13",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"pdf-lib": "^1.17.1",
|
||||
"qr-scanner": "^1.4.2",
|
||||
"qrcode": "^1.5.3",
|
||||
"sweetalert2": "^11.14.5",
|
||||
"qrcode": "^1.5.4",
|
||||
"sweetalert2": "^11.22.4",
|
||||
"vite-plugin-copy": "^0.1.6",
|
||||
"vite-plugin-html": "^3.2.2",
|
||||
"vite-plugin-wasm": "^3.3.0"
|
||||
|
1
pkg/.gitignore
vendored
Normal file
1
pkg/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
*
|
277
pkg/README.md
Normal file
277
pkg/README.md
Normal file
@ -0,0 +1,277 @@
|
||||
# sdk_client - Module WASM
|
||||
|
||||
Module WebAssembly compilé pour l'intégration des Silent Payments dans l'interface utilisateur `ihm_client`.
|
||||
|
||||
## 📋 Vue d'ensemble
|
||||
|
||||
Ce package contient le module WASM compilé de `sdk_client`, qui fournit les fonctionnalités de Silent Payments pour l'interface utilisateur.
|
||||
|
||||
### Fichiers inclus
|
||||
|
||||
- `sdk_client_bg.wasm` - Module WASM principal (3.3 MB)
|
||||
- `sdk_client.d.ts` - Déclarations TypeScript (12.6 KB)
|
||||
- `sdk_client.js` - Wrapper JavaScript (182 B)
|
||||
- `sdk_client_bg.js` - Code JavaScript généré (38 KB)
|
||||
- `package.json` - Métadonnées du package
|
||||
- `README.md` - Ce fichier
|
||||
|
||||
## 🚀 Utilisation
|
||||
|
||||
### Import dans TypeScript
|
||||
|
||||
```typescript
|
||||
import init, {
|
||||
generate_sp_wallet,
|
||||
lock_freezed_utxos,
|
||||
// ... autres fonctions
|
||||
} from 'pkg/sdk_client';
|
||||
|
||||
// Initialiser le module WASM
|
||||
await init();
|
||||
|
||||
// Utiliser les fonctions
|
||||
const wallet = generate_sp_wallet();
|
||||
```
|
||||
|
||||
### Import dans JavaScript
|
||||
|
||||
```javascript
|
||||
import init, { generate_sp_wallet } from 'pkg/sdk_client';
|
||||
|
||||
// Initialiser le module WASM
|
||||
await init();
|
||||
|
||||
// Utiliser les fonctions
|
||||
const wallet = generate_sp_wallet();
|
||||
```
|
||||
|
||||
## 🔧 Configuration
|
||||
|
||||
### Variables d'environnement
|
||||
|
||||
```bash
|
||||
# Configuration pour le développement
|
||||
NODE_ENV=development
|
||||
VITE_WASM_PATH=./pkg/sdk_client_bg.wasm
|
||||
|
||||
# Configuration pour la production
|
||||
NODE_ENV=production
|
||||
VITE_WASM_PATH=/assets/sdk_client_bg.wasm
|
||||
```
|
||||
|
||||
### Configuration Vite
|
||||
|
||||
```typescript
|
||||
// vite.config.ts
|
||||
import { defineConfig } from 'vite';
|
||||
import wasm from 'vite-plugin-wasm';
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
wasm(),
|
||||
// ... autres plugins
|
||||
],
|
||||
optimizeDeps: {
|
||||
exclude: ['pkg/sdk_client']
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## 📚 API Reference
|
||||
|
||||
### Fonctions principales
|
||||
|
||||
#### `generate_sp_wallet()`
|
||||
Génère un nouveau wallet Silent Payment.
|
||||
|
||||
**Retourne :** `Wallet` - Instance du wallet généré
|
||||
|
||||
#### `lock_freezed_utxos(wallet: Wallet, utxos: UTXO[])`
|
||||
Verrouille les UTXOs gelés dans le wallet.
|
||||
|
||||
**Paramètres :**
|
||||
- `wallet` - Instance du wallet
|
||||
- `utxos` - Liste des UTXOs à verrouiller
|
||||
|
||||
**Retourne :** `boolean` - Succès de l'opération
|
||||
|
||||
### Types TypeScript
|
||||
|
||||
```typescript
|
||||
interface Wallet {
|
||||
id: string;
|
||||
address: string;
|
||||
balance: number;
|
||||
// ... autres propriétés
|
||||
}
|
||||
|
||||
interface UTXO {
|
||||
txid: string;
|
||||
vout: number;
|
||||
amount: number;
|
||||
// ... autres propriétés
|
||||
}
|
||||
```
|
||||
|
||||
## 🧪 Tests
|
||||
|
||||
### Tests unitaires
|
||||
|
||||
```bash
|
||||
# Tests des fonctions WASM
|
||||
npm run test:wasm
|
||||
|
||||
# Tests avec couverture
|
||||
npm run test:wasm:coverage
|
||||
```
|
||||
|
||||
### Tests d'intégration
|
||||
|
||||
```bash
|
||||
# Tests d'intégration avec l'interface
|
||||
npm run test:integration
|
||||
|
||||
# Tests end-to-end
|
||||
npm run test:e2e
|
||||
```
|
||||
|
||||
## 🔍 Debugging
|
||||
|
||||
### Logs de développement
|
||||
|
||||
```typescript
|
||||
// Activer les logs détaillés
|
||||
import { set_panic_hook } from 'pkg/sdk_client';
|
||||
|
||||
set_panic_hook();
|
||||
```
|
||||
|
||||
### Inspection du module
|
||||
|
||||
```javascript
|
||||
// Inspecter les exports disponibles
|
||||
import * as sdk_client from 'pkg/sdk_client';
|
||||
console.log(Object.keys(sdk_client));
|
||||
```
|
||||
|
||||
## 📦 Build
|
||||
|
||||
### Compilation WASM
|
||||
|
||||
```bash
|
||||
# Compiler le module WASM
|
||||
cd temp-deps/sdk_client
|
||||
wasm-pack build --target web --out-dir ../../pkg
|
||||
|
||||
# Ou utiliser le script automatisé
|
||||
./scripts/setup-remote-deps.sh
|
||||
```
|
||||
|
||||
### Optimisation
|
||||
|
||||
```bash
|
||||
# Optimiser la taille du module
|
||||
wasm-opt -O4 -o sdk_client_bg.wasm sdk_client_bg.wasm
|
||||
|
||||
# Compresser le module
|
||||
gzip -9 sdk_client_bg.wasm
|
||||
```
|
||||
|
||||
## 🚨 Dépannage
|
||||
|
||||
### Problèmes courants
|
||||
|
||||
#### Module non trouvé
|
||||
```bash
|
||||
# Vérifier que le module est compilé
|
||||
ls -la pkg/sdk_client_bg.wasm
|
||||
|
||||
# Recompiler si nécessaire
|
||||
./scripts/setup-remote-deps.sh
|
||||
```
|
||||
|
||||
#### Erreurs de type TypeScript
|
||||
```bash
|
||||
# Régénérer les types
|
||||
cd temp-deps/sdk_client
|
||||
wasm-pack build --target web --out-dir ../../pkg
|
||||
|
||||
# Vérifier la cohérence des types
|
||||
npm run type-check
|
||||
```
|
||||
|
||||
#### Problèmes de performance
|
||||
```bash
|
||||
# Vérifier la taille du module
|
||||
ls -lh pkg/sdk_client_bg.wasm
|
||||
|
||||
# Optimiser si nécessaire
|
||||
wasm-opt -O4 -o pkg/sdk_client_bg.wasm pkg/sdk_client_bg.wasm
|
||||
```
|
||||
|
||||
## 📈 Performance
|
||||
|
||||
### Métriques
|
||||
|
||||
- **Taille du module** : 3.3 MB (non compressé)
|
||||
- **Temps de chargement** : ~500ms (dépendant du réseau)
|
||||
- **Temps d'initialisation** : ~100ms
|
||||
- **Mémoire utilisée** : ~10MB
|
||||
|
||||
### Optimisations
|
||||
|
||||
1. **Compression gzip** : Réduit la taille de ~70%
|
||||
2. **Lazy loading** : Chargement à la demande
|
||||
3. **Caching** : Mise en cache du module
|
||||
4. **Preloading** : Préchargement anticipé
|
||||
|
||||
## 🔒 Sécurité
|
||||
|
||||
### Bonnes pratiques
|
||||
|
||||
- Ne jamais exposer les clés privées
|
||||
- Valider toutes les entrées utilisateur
|
||||
- Utiliser HTTPS en production
|
||||
- Maintenir les dépendances à jour
|
||||
|
||||
### Audit de sécurité
|
||||
|
||||
```bash
|
||||
# Vérifier les vulnérabilités
|
||||
npm audit
|
||||
|
||||
# Audit des dépendances Rust
|
||||
cargo audit
|
||||
```
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
### Liens utiles
|
||||
|
||||
- [Documentation WASM](https://webassembly.org/docs/)
|
||||
- [Documentation wasm-pack](https://rustwasm.github.io/docs/wasm-pack/)
|
||||
- [Documentation sdk_client](../temp-deps/sdk_client/README.md)
|
||||
- [Documentation sdk_common](../temp-deps/sdk_common/README.md)
|
||||
|
||||
### Exemples
|
||||
|
||||
- [Exemples d'utilisation](../docs/API.md)
|
||||
- [Tests d'intégration](../tests/)
|
||||
- [Guide de développement](../CONTRIBUTING.md)
|
||||
|
||||
## 🤝 Contribution
|
||||
|
||||
Pour contribuer au module WASM :
|
||||
|
||||
1. Modifier le code source dans `temp-deps/sdk_client/`
|
||||
2. Recompiler avec `./scripts/setup-remote-deps.sh`
|
||||
3. Tester les changements
|
||||
4. Mettre à jour la documentation
|
||||
|
||||
## 📄 Licence
|
||||
|
||||
Ce module est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
|
||||
|
||||
---
|
||||
|
||||
**🚀 Module WASM sdk_client - Prêt pour l'intégration !**
|
17
pkg/package.json
Normal file
17
pkg/package.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "sdk_client",
|
||||
"type": "module",
|
||||
"version": "1.1.0",
|
||||
"files": [
|
||||
"sdk_client_bg.wasm",
|
||||
"sdk_client.js",
|
||||
"sdk_client_bg.js",
|
||||
"sdk_client.d.ts"
|
||||
],
|
||||
"main": "sdk_client.js",
|
||||
"types": "sdk_client.d.ts",
|
||||
"sideEffects": [
|
||||
"./sdk_client.js",
|
||||
"./snippets/*"
|
||||
]
|
||||
}
|
355
pkg/sdk_client.d.ts
vendored
Normal file
355
pkg/sdk_client.d.ts
vendored
Normal file
@ -0,0 +1,355 @@
|
||||
/* tslint:disable */
|
||||
/* eslint-disable */
|
||||
export function setup(): void;
|
||||
export function get_address(): string;
|
||||
export function get_member(): Member;
|
||||
export function restore_device(device: any): void;
|
||||
export function create_device_from_sp_wallet(sp_wallet: string): string;
|
||||
export function create_new_device(birthday: number, network_str: string): string;
|
||||
export function is_paired(): boolean;
|
||||
export function pair_device(process_id: string, sp_addresses: string[]): void;
|
||||
export function unpair_device(): void;
|
||||
export function dump_wallet(): string;
|
||||
export function reset_process_cache(): void;
|
||||
export function dump_process_cache(): string;
|
||||
export function set_process_cache(processes: any): void;
|
||||
export function add_to_process_cache(process_id: string, process: string): void;
|
||||
export function reset_shared_secrets(): void;
|
||||
export function set_shared_secrets(secrets: string): void;
|
||||
export function get_pairing_process_id(): string;
|
||||
export function dump_device(): Device;
|
||||
export function dump_neutered_device(): Device;
|
||||
export function reset_device(): void;
|
||||
export function get_txid(transaction: string): string;
|
||||
export function parse_new_tx(new_tx_msg: string, block_height: number, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function parse_cipher(cipher_msg: string, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function get_outputs(): any;
|
||||
export function get_available_amount(): bigint;
|
||||
/**
|
||||
* We send a transaction that pays at least one output to each address
|
||||
* The goal can be to establish a shared_secret to be used as an encryption key for further communication
|
||||
* or if the recipient is a relay it can be the init transaction for a new process
|
||||
*/
|
||||
export function create_transaction(addresses: string[], fee_rate: number): ApiReturn;
|
||||
export function sign_transaction(partial_tx: TsUnsignedTransaction): ApiReturn;
|
||||
export function create_new_process(private_data: Pcd, roles: Roles, public_data: Pcd, relay_address: string, fee_rate: number, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function update_process(process: Process, new_attributes: Pcd, roles: Roles, new_public_data: Pcd, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function request_data(process_id: string, state_ids_str: string[], roles: any, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function create_update_message(process: Process, state_id: string, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function validate_state(process: Process, state_id: string, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function refuse_state(process: Process, state_id: string, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function evaluate_state(process: Process, state_id: string, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function create_response_prd(process: Process, state_id: string, members_list: OutPointMemberMap): ApiReturn;
|
||||
export function create_faucet_msg(): string;
|
||||
export function get_storages(process_outpoint: string): string[];
|
||||
export function is_child_role(parent_roles: string, child_roles: string): void;
|
||||
export function decrypt_data(key: Uint8Array, data: Uint8Array): Uint8Array;
|
||||
export function encode_binary(data: any): Pcd;
|
||||
export function encode_json(json_data: any): Pcd;
|
||||
export function decode_value(value: Uint8Array): any;
|
||||
export function hash_value(value: any, commited_in: string, label: string): string;
|
||||
/**
|
||||
* Generate a merkle proof for a specific attribute in a process state.
|
||||
*
|
||||
* This function creates a merkle proof that proves the existence of a specific attribute
|
||||
* in a given state of a process. The proof can be used to verify that the attribute
|
||||
* was indeed part of the state without revealing the entire state.
|
||||
*
|
||||
* # Arguments
|
||||
* * `process_state` - The process state object as a JavaScript value
|
||||
* * `attribute_name` - The name of the attribute to generate a proof for
|
||||
*
|
||||
* # Returns
|
||||
* A MerkleProofResult object containing:
|
||||
* * `proof` - The merkle proof as a hex string
|
||||
* * `root` - The merkle root (state_id) as a hex string
|
||||
* * `attribute` - The attribute name that was proven
|
||||
* * `attribute_index` - The index of the attribute in the merkle tree
|
||||
* * `total_leaves_count` - The total number of leaves in the merkle tree
|
||||
*
|
||||
* # Errors
|
||||
* * "Failed to deserialize process state" - If the process state cannot be deserialized from JsValue
|
||||
* * "Attribute not found in state" - If the attribute doesn't exist in the state
|
||||
*/
|
||||
export function get_merkle_proof(process_state: any, attribute_name: string): MerkleProofResult;
|
||||
/**
|
||||
* Validate a merkle proof for a specific attribute.
|
||||
*
|
||||
* This function verifies that a merkle proof is valid and proves the existence
|
||||
* of a specific attribute in a given state. It checks that the proof correctly
|
||||
* leads to the claimed root when combined with the attribute hash.
|
||||
*
|
||||
* # Arguments
|
||||
* * `proof_result` - a JsValue expected to contain a MerkleProofResult with the proof and metadata
|
||||
* * `hash` - The hash of the attribute data as a hex string (the leaf value)
|
||||
*
|
||||
* # Returns
|
||||
* A boolean indicating whether the proof is valid
|
||||
*
|
||||
* # Errors
|
||||
* * "serde_wasm_bindgen deserialization error" - If the proof is not a valid MerkleProofResult
|
||||
* * "Invalid proof format" - If the proof cannot be parsed
|
||||
* * "Invalid hash format" - If the hash is not a valid 32-byte hex string
|
||||
* * "Invalid root format" - If the root is not a valid 32-byte hex string
|
||||
*/
|
||||
export function validate_merkle_proof(proof_result: any, hash: string): boolean;
|
||||
export type DiffStatus = "None" | "Rejected" | "Validated";
|
||||
|
||||
export interface UserDiff {
|
||||
process_id: string;
|
||||
state_id: string;
|
||||
value_commitment: string;
|
||||
field: string;
|
||||
roles: Roles;
|
||||
description: string | null;
|
||||
notify_user: boolean;
|
||||
need_validation: boolean;
|
||||
validation_status: DiffStatus;
|
||||
}
|
||||
|
||||
export interface UpdatedProcess {
|
||||
process_id: OutPoint;
|
||||
current_process: Process;
|
||||
diffs: UserDiff[];
|
||||
encrypted_data: Record<string, string>;
|
||||
validated_state: number[] | null;
|
||||
}
|
||||
|
||||
export interface ApiReturn {
|
||||
secrets: SecretsStore | null;
|
||||
updated_process: UpdatedProcess | null;
|
||||
new_tx_to_send: NewTxMessage | null;
|
||||
ciphers_to_send: string[];
|
||||
commit_to_send: CommitMessage | null;
|
||||
push_to_storage: string[];
|
||||
partial_tx: TsUnsignedTransaction | null;
|
||||
}
|
||||
|
||||
export interface encryptWithNewKeyResult {
|
||||
cipher: string;
|
||||
key: string;
|
||||
}
|
||||
|
||||
export interface MerkleProofResult {
|
||||
proof: string;
|
||||
root: string;
|
||||
attribute: string;
|
||||
attribute_index: number;
|
||||
total_leaves_count: number;
|
||||
}
|
||||
|
||||
export interface Device {
|
||||
sp_wallet: SpWallet;
|
||||
pairing_process_commitment: OutPoint | null;
|
||||
paired_member: Member;
|
||||
}
|
||||
|
||||
export interface Prd {
|
||||
prd_type: PrdType;
|
||||
process_id: OutPoint;
|
||||
sender: Member;
|
||||
keys: Record<string, number[]>;
|
||||
pcd_commitments: PcdCommitments;
|
||||
validation_tokens: Proof[];
|
||||
roles: Roles;
|
||||
public_data: Pcd;
|
||||
payload: string;
|
||||
proof: Proof | null;
|
||||
}
|
||||
|
||||
export type PrdType = "None" | "Connect" | "Message" | "Update" | "List" | "Response" | "Confirm" | "TxProposal" | "Request";
|
||||
|
||||
/**
|
||||
* Réponse de synchronisation
|
||||
*/
|
||||
export interface SyncResponse {
|
||||
request_id: string;
|
||||
relay_id: string;
|
||||
success: boolean;
|
||||
messages: SyncMessage[];
|
||||
error: string | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Requête de synchronisation
|
||||
*/
|
||||
export interface SyncRequest {
|
||||
request_id: string;
|
||||
relay_id: string;
|
||||
sync_types: SyncType[];
|
||||
since_timestamp: number | null;
|
||||
max_items: number | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Capacité d\'un relais
|
||||
*/
|
||||
export interface Capability {
|
||||
name: string;
|
||||
version: string;
|
||||
enabled: boolean;
|
||||
parameters: Record<string, string>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Connexion mesh entre relais
|
||||
*/
|
||||
export interface MeshConnection {
|
||||
from_relay: string;
|
||||
to_relay: string;
|
||||
latency: number;
|
||||
bandwidth: number;
|
||||
last_heartbeat: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Topologie du réseau
|
||||
*/
|
||||
export interface NetworkTopology {
|
||||
total_relays: number;
|
||||
connected_relays: number;
|
||||
mesh_connections: MeshConnection[];
|
||||
network_diameter: number;
|
||||
avg_latency: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Statut de santé d\'un relais
|
||||
*/
|
||||
export type HealthStatus = "Healthy" | "Warning" | "Critical" | "Offline";
|
||||
|
||||
/**
|
||||
* Informations sur un relais
|
||||
*/
|
||||
export interface RelayInfo {
|
||||
relay_id: string;
|
||||
address: string;
|
||||
sp_address: string;
|
||||
version: string;
|
||||
uptime: number;
|
||||
last_seen: number;
|
||||
capabilities: string[];
|
||||
health_status: HealthStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Informations sur un pair
|
||||
*/
|
||||
export interface PeerInfo {
|
||||
address: string;
|
||||
sp_address: string;
|
||||
connected_since: number;
|
||||
last_activity: number;
|
||||
message_count: number;
|
||||
capabilities: string[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Contenu des messages de synchronisation
|
||||
*/
|
||||
export type SyncPayload = { StateData: { chain_tip: number; wallet_balance: number; active_processes: number; connected_peers: number } } | { ProcessData: { processes: OutPointProcessMap; last_update: number } } | { MemberData: { members: OutPointMemberMap; last_update: number } } | { TransactionData: { txid: string; height: number | null; confirmed: boolean; sp_outputs: string[] } } | { BlockData: { height: number; hash: string; timestamp: number; tx_count: number } } | { PeerData: { peers: PeerInfo[]; last_seen: number } } | { RelayData: { relays: RelayInfo[]; network_topology: NetworkTopology } } | { HealthData: { uptime: number; memory_usage: number; cpu_usage: number; active_connections: number; last_block_time: number } } | { MetricsData: { messages_processed: number; transactions_broadcast: number; blocks_scanned: number; errors_count: number; avg_response_time: number } } | { ConfigData: { config_hash: string; features: string[]; version: string } } | { CapabilityData: { capabilities: Capability[]; supported_networks: string[] } };
|
||||
|
||||
/**
|
||||
* Types de synchronisation
|
||||
*/
|
||||
export type SyncType = "StateSync" | "ProcessSync" | "MemberSync" | "TxSync" | "BlockSync" | "PeerSync" | "RelaySync" | "HealthSync" | "MetricsSync" | "ConfigSync" | "CapabilitySync";
|
||||
|
||||
/**
|
||||
* Message de synchronisation pour le réseau mesh des relais
|
||||
*/
|
||||
export interface SyncMessage {
|
||||
sync_type: SyncType;
|
||||
relay_id: string;
|
||||
timestamp: number;
|
||||
sequence_number: number;
|
||||
payload: SyncPayload;
|
||||
signature: string | null;
|
||||
}
|
||||
|
||||
export interface HandshakeMessage {
|
||||
sp_address: string;
|
||||
peers_list: OutPointMemberMap;
|
||||
processes_list: OutPointProcessMap;
|
||||
chain_tip: number;
|
||||
}
|
||||
|
||||
export interface NewTxMessage {
|
||||
transaction: string;
|
||||
tweak_data: string | null;
|
||||
error: AnkError | null;
|
||||
}
|
||||
|
||||
export interface FaucetMessage {
|
||||
sp_address: string;
|
||||
commitment: string;
|
||||
error: AnkError | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Message sent to the server to commit some state in a transaction
|
||||
* Client must first send a commit message with empty validation_tokens
|
||||
* Relay will ignore a commit message for an update he\'s not aware of that also bears validation_tokens
|
||||
*/
|
||||
export interface CommitMessage {
|
||||
process_id: OutPoint;
|
||||
pcd_commitment: PcdCommitments;
|
||||
roles: Roles;
|
||||
public_data: Pcd;
|
||||
validation_tokens: Proof[];
|
||||
error: AnkError | null;
|
||||
}
|
||||
|
||||
export type AnkFlag = "NewTx" | "Faucet" | "Cipher" | "Commit" | "Handshake" | "Sync" | "Unknown";
|
||||
|
||||
export type OutPointProcessMap = Record<OutPoint, Process>;
|
||||
|
||||
export type OutPointMemberMap = Record<OutPoint, Member>;
|
||||
|
||||
/**
|
||||
* A process is basically a succession of states
|
||||
* The latest state MUST be an empty state with only the commited_in field set at the last unspent outpoint
|
||||
* Commiting this last empty state in a transaction is called obliterating a process, basically terminating it
|
||||
*/
|
||||
export interface Process {
|
||||
states: ProcessState[];
|
||||
}
|
||||
|
||||
export interface ProcessState {
|
||||
commited_in: OutPoint;
|
||||
pcd_commitment: Record<string, string>;
|
||||
state_id: string;
|
||||
keys: Record<string, string>;
|
||||
validation_tokens: Proof[];
|
||||
public_data: Pcd;
|
||||
roles: Record<string, RoleDefinition>;
|
||||
}
|
||||
|
||||
export type TsUnsignedTransaction = SilentPaymentUnsignedTransaction;
|
||||
|
||||
export interface SecretsStore {
|
||||
shared_secrets: Record<SilentPaymentAddress, AnkSharedSecretHash>;
|
||||
unconfirmed_secrets: AnkSharedSecretHash[];
|
||||
}
|
||||
|
||||
export type Roles = Record<string, RoleDefinition>;
|
||||
|
||||
export interface RoleDefinition {
|
||||
members: OutPoint[];
|
||||
validation_rules: ValidationRule[];
|
||||
storages: string[];
|
||||
}
|
||||
|
||||
export interface ValidationRule {
|
||||
quorum: number;
|
||||
fields: string[];
|
||||
min_sig_member: number;
|
||||
}
|
||||
|
||||
export type PcdCommitments = Record<string, string>;
|
||||
|
||||
export type Pcd = Record<string, number[]>;
|
||||
|
||||
export interface Member {
|
||||
sp_addresses: string[];
|
||||
}
|
||||
|
5
pkg/sdk_client.js
Normal file
5
pkg/sdk_client.js
Normal file
@ -0,0 +1,5 @@
|
||||
import * as wasm from "./sdk_client_bg.wasm";
|
||||
export * from "./sdk_client_bg.js";
|
||||
import { __wbg_set_wasm } from "./sdk_client_bg.js";
|
||||
__wbg_set_wasm(wasm);
|
||||
wasm.__wbindgen_start();
|
1342
pkg/sdk_client_bg.js
Normal file
1342
pkg/sdk_client_bg.js
Normal file
File diff suppressed because it is too large
Load Diff
BIN
pkg/sdk_client_bg.wasm
Normal file
BIN
pkg/sdk_client_bg.wasm
Normal file
Binary file not shown.
69
pkg/sdk_client_bg.wasm.d.ts
vendored
Normal file
69
pkg/sdk_client_bg.wasm.d.ts
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
/* tslint:disable */
|
||||
/* eslint-disable */
|
||||
export const memory: WebAssembly.Memory;
|
||||
export const get_address: () => [number, number, number, number];
|
||||
export const get_member: () => [number, number, number];
|
||||
export const restore_device: (a: any) => [number, number];
|
||||
export const create_device_from_sp_wallet: (a: number, b: number) => [number, number, number, number];
|
||||
export const create_new_device: (a: number, b: number, c: number) => [number, number, number, number];
|
||||
export const is_paired: () => [number, number, number];
|
||||
export const pair_device: (a: number, b: number, c: number, d: number) => [number, number];
|
||||
export const unpair_device: () => [number, number];
|
||||
export const dump_wallet: () => [number, number, number, number];
|
||||
export const reset_process_cache: () => [number, number];
|
||||
export const dump_process_cache: () => [number, number, number, number];
|
||||
export const set_process_cache: (a: any) => [number, number];
|
||||
export const add_to_process_cache: (a: number, b: number, c: number, d: number) => [number, number];
|
||||
export const reset_shared_secrets: () => [number, number];
|
||||
export const set_shared_secrets: (a: number, b: number) => [number, number];
|
||||
export const get_pairing_process_id: () => [number, number, number, number];
|
||||
export const dump_device: () => [number, number, number];
|
||||
export const dump_neutered_device: () => [number, number, number];
|
||||
export const reset_device: () => [number, number];
|
||||
export const get_txid: (a: number, b: number) => [number, number, number, number];
|
||||
export const parse_new_tx: (a: number, b: number, c: number, d: any) => [number, number, number];
|
||||
export const parse_cipher: (a: number, b: number, c: any) => [number, number, number];
|
||||
export const get_outputs: () => [number, number, number];
|
||||
export const get_available_amount: () => [bigint, number, number];
|
||||
export const create_transaction: (a: number, b: number, c: number) => [number, number, number];
|
||||
export const sign_transaction: (a: any) => [number, number, number];
|
||||
export const create_new_process: (a: any, b: any, c: any, d: number, e: number, f: number, g: any) => [number, number, number];
|
||||
export const update_process: (a: any, b: any, c: any, d: any, e: any) => [number, number, number];
|
||||
export const request_data: (a: number, b: number, c: number, d: number, e: any, f: any) => [number, number, number];
|
||||
export const create_update_message: (a: any, b: number, c: number, d: any) => [number, number, number];
|
||||
export const validate_state: (a: any, b: number, c: number, d: any) => [number, number, number];
|
||||
export const refuse_state: (a: any, b: number, c: number, d: any) => [number, number, number];
|
||||
export const evaluate_state: (a: any, b: number, c: number, d: any) => [number, number, number];
|
||||
export const create_response_prd: (a: any, b: number, c: number, d: any) => [number, number, number];
|
||||
export const create_faucet_msg: () => [number, number, number, number];
|
||||
export const get_storages: (a: number, b: number) => [number, number, number, number];
|
||||
export const is_child_role: (a: number, b: number, c: number, d: number) => [number, number];
|
||||
export const decrypt_data: (a: number, b: number, c: number, d: number) => [number, number, number, number];
|
||||
export const encode_binary: (a: any) => [number, number, number];
|
||||
export const encode_json: (a: any) => [number, number, number];
|
||||
export const decode_value: (a: number, b: number) => [number, number, number];
|
||||
export const hash_value: (a: any, b: number, c: number, d: number, e: number) => [number, number, number, number];
|
||||
export const get_merkle_proof: (a: any, b: number, c: number) => [number, number, number];
|
||||
export const validate_merkle_proof: (a: any, b: number, c: number) => [number, number, number];
|
||||
export const setup: () => void;
|
||||
export const rust_zstd_wasm_shim_qsort: (a: number, b: number, c: number, d: number) => void;
|
||||
export const rust_zstd_wasm_shim_malloc: (a: number) => number;
|
||||
export const rust_zstd_wasm_shim_memcmp: (a: number, b: number, c: number) => number;
|
||||
export const rust_zstd_wasm_shim_calloc: (a: number, b: number) => number;
|
||||
export const rust_zstd_wasm_shim_free: (a: number) => void;
|
||||
export const rust_zstd_wasm_shim_memcpy: (a: number, b: number, c: number) => number;
|
||||
export const rust_zstd_wasm_shim_memmove: (a: number, b: number, c: number) => number;
|
||||
export const rust_zstd_wasm_shim_memset: (a: number, b: number, c: number) => number;
|
||||
export const rustsecp256k1_v0_9_2_context_create: (a: number) => number;
|
||||
export const rustsecp256k1_v0_9_2_context_destroy: (a: number) => void;
|
||||
export const rustsecp256k1_v0_9_2_default_illegal_callback_fn: (a: number, b: number) => void;
|
||||
export const rustsecp256k1_v0_9_2_default_error_callback_fn: (a: number, b: number) => void;
|
||||
export const __wbindgen_malloc: (a: number, b: number) => number;
|
||||
export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
||||
export const __wbindgen_exn_store: (a: number) => void;
|
||||
export const __externref_table_alloc: () => number;
|
||||
export const __wbindgen_export_4: WebAssembly.Table;
|
||||
export const __externref_table_dealloc: (a: number) => void;
|
||||
export const __wbindgen_free: (a: number, b: number, c: number) => void;
|
||||
export const __externref_drop_slice: (a: number, b: number) => void;
|
||||
export const __wbindgen_start: () => void;
|
18
playwright.config.ts
Normal file
18
playwright.config.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { defineConfig, devices } from '@playwright/test';
|
||||
|
||||
export default defineConfig({
|
||||
testDir: './tests/e2e',
|
||||
timeout: 30000,
|
||||
use: {
|
||||
baseURL: 'http://localhost:3000',
|
||||
headless: true,
|
||||
},
|
||||
webServer: {
|
||||
command: 'npx vite preview --strictPort --port 3000',
|
||||
port: 3000,
|
||||
reuseExistingServer: !process.env.CI,
|
||||
},
|
||||
projects: [
|
||||
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
|
||||
],
|
||||
});
|
@ -77,6 +77,99 @@ body {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Confirmation Modal Styles */
|
||||
#confirmation-modal {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.modal-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
background: white;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
width: 90%;
|
||||
max-width: 500px;
|
||||
max-height: 80vh;
|
||||
overflow-y: auto;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.modal-confirmation {
|
||||
text-align: left;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.modal-confirmation h3 {
|
||||
margin-bottom: 15px;
|
||||
color: var(--primary-color);
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.modal-confirmation p {
|
||||
margin: 8px 0;
|
||||
font-size: 0.9em;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
margin-top: 20px;
|
||||
padding-top: 15px;
|
||||
border-top: 1px solid #eee;
|
||||
}
|
||||
|
||||
.modal-footer button {
|
||||
padding: 8px 16px;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: var(--primary-color);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background: var(--secondary-color);
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Responsive adjustments */
|
||||
@media only screen and (max-width: 600px) {
|
||||
.modal-content {
|
||||
width: 95%;
|
||||
margin: 10px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.modal-confirmation h3 {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.modal-confirmation p {
|
||||
font-size: 0.85em;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-wrapper {
|
||||
position: fixed;
|
||||
|
@ -427,24 +427,43 @@ body {
|
||||
|
||||
/* Style pour la modal de confirmation */
|
||||
.confirm-delete-modal {
|
||||
display: none;
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background: white;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.confirm-delete-content {
|
||||
background-color: white;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
z-index: 1100;
|
||||
max-width: 400px;
|
||||
width: 90%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.confirm-delete-content h3 {
|
||||
margin-top: 0;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.confirm-delete-content p {
|
||||
margin: 15px 0;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.confirm-delete-buttons {
|
||||
margin-top: 20px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 10px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.confirm-delete-buttons button {
|
||||
@ -452,25 +471,27 @@ body {
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
|
||||
.confirm-btn {
|
||||
.confirm-delete-buttons .confirm-btn {
|
||||
background-color: #dc3545;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.cancel-btn {
|
||||
.confirm-delete-buttons .confirm-btn:hover {
|
||||
background-color: #c82333;
|
||||
}
|
||||
|
||||
.confirm-delete-buttons .cancel-btn {
|
||||
background-color: #6c757d;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.delete-account-section {
|
||||
border-top: 1px solid #eee;
|
||||
padding-top: 15px;
|
||||
margin-top: 15px;
|
||||
.confirm-delete-buttons .cancel-btn:hover {
|
||||
background-color: #5a6268;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------- Export--------------------------------------*/
|
||||
.export-section {
|
||||
margin: 20px 0;
|
||||
@ -1423,3 +1444,64 @@ body {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.pairing-modal {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.pairing-modal-content {
|
||||
background-color: white;
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
width: 90%;
|
||||
max-width: 500px;
|
||||
}
|
||||
|
||||
.pairing-form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.button-group {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
justify-content: flex-end;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.button-group button {
|
||||
padding: 0.5rem 1rem;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.confirm-button {
|
||||
background-color: var(--accent-color);
|
||||
color: white;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.cancel-button {
|
||||
background-color: #ccc;
|
||||
border: none;
|
||||
}
|
||||
|
155
scripts/auto-ssh-push.sh
Executable file
155
scripts/auto-ssh-push.sh
Executable file
@ -0,0 +1,155 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script d'automatisation des push SSH pour ihm_client
|
||||
# Utilise automatiquement la clé SSH pour tous les push
|
||||
|
||||
set -e
|
||||
|
||||
echo "🔑 Configuration automatique SSH pour push ihm_client..."
|
||||
|
||||
# Configuration SSH automatique
|
||||
echo "⚙️ Configuration Git pour utiliser SSH..."
|
||||
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||
|
||||
# Vérifier la configuration SSH
|
||||
echo "🔍 Vérification de la configuration SSH..."
|
||||
if ! ssh -T git@git.4nkweb.com 2>&1 | grep -q "successfully authenticated"; then
|
||||
echo "❌ Échec de l'authentification SSH"
|
||||
echo "💡 Vérifiez que votre clé SSH est configurée :"
|
||||
echo " 1. ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_4nk"
|
||||
echo " 2. Ajouter la clé publique à votre compte Gitea"
|
||||
echo " 3. ssh-add ~/.ssh/id_ed25519_4nk"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Authentification SSH réussie"
|
||||
|
||||
# Fonction pour push automatique
|
||||
auto_push() {
|
||||
local branch=${1:-$(git branch --show-current)}
|
||||
local commit_message=${2:-"Auto-commit $(date '+%Y-%m-%d %H:%M:%S')"}
|
||||
|
||||
echo "🚀 Push automatique sur la branche: $branch"
|
||||
|
||||
# Ajouter tous les changements
|
||||
git add .
|
||||
|
||||
# Commiter avec le message fourni
|
||||
git commit -m "$commit_message"
|
||||
|
||||
# Push avec SSH automatique
|
||||
echo "📤 Push vers origin/$branch..."
|
||||
git push origin "$branch"
|
||||
|
||||
echo "✅ Push réussi !"
|
||||
}
|
||||
|
||||
# Fonction pour push avec message personnalisé
|
||||
push_with_message() {
|
||||
local message="$1"
|
||||
local branch=${2:-$(git branch --show-current)}
|
||||
|
||||
echo "💬 Push avec message: $message"
|
||||
auto_push "$branch" "$message"
|
||||
}
|
||||
|
||||
# Fonction pour push rapide (sans message)
|
||||
quick_push() {
|
||||
local branch=${1:-$(git branch --show-current)}
|
||||
auto_push "$branch"
|
||||
}
|
||||
|
||||
# Fonction pour push sur une branche spécifique
|
||||
push_branch() {
|
||||
local branch="$1"
|
||||
local message=${2:-"Update $branch $(date '+%Y-%m-%d %H:%M:%S')"}
|
||||
|
||||
echo "🌿 Push sur la branche: $branch"
|
||||
auto_push "$branch" "$message"
|
||||
}
|
||||
|
||||
# Fonction pour push et merge vers main
|
||||
push_and_merge() {
|
||||
local source_branch=${1:-$(git branch --show-current)}
|
||||
local target_branch=${2:-main}
|
||||
|
||||
echo "🔄 Push et merge $source_branch -> $target_branch"
|
||||
|
||||
# Push de la branche source
|
||||
auto_push "$source_branch"
|
||||
|
||||
# Demander confirmation pour le merge
|
||||
read -p "Voulez-vous créer une Pull Request pour merger vers $target_branch ? (y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "🔗 Création de la Pull Request..."
|
||||
echo "💡 Allez sur: https://git.4nkweb.com/4nk/ihm_client/compare/$target_branch...$source_branch"
|
||||
fi
|
||||
}
|
||||
|
||||
# Fonction pour status et push conditionnel
|
||||
status_and_push() {
|
||||
echo "📊 Statut du repository:"
|
||||
git status --short
|
||||
|
||||
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 pour ihm_client"
|
||||
echo ""
|
||||
echo "Options disponibles:"
|
||||
echo " auto-push.sh quick - Push rapide"
|
||||
echo " auto-push.sh message \"Mon message\" - Push avec message"
|
||||
echo " auto-push.sh branch nom-branche - Push sur branche spécifique"
|
||||
echo " auto-push.sh merge [source] [target] - Push et préparation merge"
|
||||
echo " auto-push.sh status - Status et push conditionnel"
|
||||
echo ""
|
||||
echo "Exemples:"
|
||||
echo " ./scripts/auto-ssh-push.sh quick"
|
||||
echo " ./scripts/auto-ssh-push.sh message \"feat: nouvelle fonctionnalité\""
|
||||
echo " ./scripts/auto-ssh-push.sh branch feature/nouvelle-fonctionnalite"
|
||||
echo " ./scripts/auto-ssh-push.sh merge feature/nouvelle-fonctionnalite main"
|
||||
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"
|
||||
;;
|
||||
"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é !"
|
20
scripts/checks/version_alignment.sh
Executable file
20
scripts/checks/version_alignment.sh
Executable file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd)"
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
version_file="VERSION"
|
||||
[[ -f TEMPLATE_VERSION ]] && version_file="TEMPLATE_VERSION"
|
||||
|
||||
[[ -f "$version_file" ]] || { echo "Version file missing ($version_file)"; exit 1; }
|
||||
v=$(tr -d '\r' < "$version_file" | head -n1)
|
||||
[[ -n "$v" ]] || { echo "Empty version"; exit 1; }
|
||||
|
||||
echo "Version file: $version_file=$v"
|
||||
|
||||
if ! grep -Eq "^## \\[$(echo "$v" | sed 's/^v//')\\]" CHANGELOG.md; then
|
||||
echo "CHANGELOG entry for $v not found"; exit 1;
|
||||
fi
|
||||
|
||||
echo "Version alignment OK"
|
23
scripts/cleanup-deps.sh
Executable file
23
scripts/cleanup-deps.sh
Executable file
@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
echo "🧹 Nettoyage des dépendances temporaires..."
|
||||
|
||||
# Suppression du dossier temporaire
|
||||
if [ -d "./temp-deps" ]; then
|
||||
echo " → Suppression de ./temp-deps/"
|
||||
rm -rf ./temp-deps
|
||||
echo "✅ Dossier temp-deps supprimé"
|
||||
else
|
||||
echo "ℹ️ Aucun dossier temp-deps trouvé"
|
||||
fi
|
||||
|
||||
# Vérification des fichiers WASM
|
||||
if [ -d "./pkg" ]; then
|
||||
echo "📁 Fichiers WASM conservés dans ./pkg/"
|
||||
ls -la ./pkg/
|
||||
else
|
||||
echo "⚠️ Aucun fichier WASM trouvé dans ./pkg/"
|
||||
fi
|
||||
|
||||
echo "✅ Nettoyage terminé"
|
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
|
152
scripts/init-ssh-env.sh
Executable file
152
scripts/init-ssh-env.sh
Executable file
@ -0,0 +1,152 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script d'initialisation de l'environnement SSH pour ihm_client
|
||||
# Configure automatiquement SSH pour tous les push
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Initialisation de l'environnement SSH pour ihm_client..."
|
||||
|
||||
# Couleurs pour les messages
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Fonction pour afficher les messages colorés
|
||||
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"
|
||||
}
|
||||
|
||||
# Vérifier si on est dans le bon répertoire
|
||||
if [[ ! -f "package.json" ]] || [[ ! -d ".git" ]]; then
|
||||
print_error "Ce script doit être exécuté depuis le répertoire racine de ihm_client"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_status "Configuration de l'environnement SSH..."
|
||||
|
||||
# 1. Configuration Git pour SSH
|
||||
print_status "Configuration Git pour utiliser SSH..."
|
||||
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||
|
||||
# 2. Vérifier si une clé SSH existe
|
||||
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"
|
||||
SSH_KEY_EXISTS=true
|
||||
else
|
||||
print_warning "Aucune clé SSH trouvée"
|
||||
SSH_KEY_EXISTS=false
|
||||
fi
|
||||
|
||||
# 3. Tester la connexion SSH
|
||||
print_status "Test de la connexion SSH vers git.4nkweb.com..."
|
||||
if ssh -T git@git.4nkweb.com 2>&1 | grep -q "successfully authenticated"; then
|
||||
print_success "Authentification SSH réussie"
|
||||
SSH_WORKING=true
|
||||
else
|
||||
print_error "Échec de l'authentification SSH"
|
||||
SSH_WORKING=false
|
||||
fi
|
||||
|
||||
# 4. Configuration des 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. Vérifier les remotes
|
||||
print_status "Vérification des remotes Git..."
|
||||
if git remote -v | grep -q "git@git.4nkweb.com"; then
|
||||
print_success "Remotes configurés pour SSH"
|
||||
else
|
||||
print_warning "Remotes non configurés pour SSH"
|
||||
print_status "Mise à jour des remotes..."
|
||||
git remote set-url origin git@git.4nkweb.com:4nk/ihm_client.git
|
||||
print_success "Remotes mis à jour"
|
||||
fi
|
||||
|
||||
# 6. Rendre les scripts exécutables
|
||||
print_status "Configuration des permissions des scripts..."
|
||||
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"
|
||||
|
||||
# 7. Créer un fichier de configuration local
|
||||
print_status "Création du fichier de configuration local..."
|
||||
cat > .ssh-config << EOF
|
||||
# Configuration SSH automatique pour ihm_client
|
||||
# Généré le $(date)
|
||||
|
||||
# Configuration Git
|
||||
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||
|
||||
# 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'
|
||||
|
||||
# Test SSH
|
||||
ssh -T git@git.4nkweb.com
|
||||
|
||||
# Scripts disponibles
|
||||
./scripts/auto-ssh-push.sh quick
|
||||
./scripts/auto-ssh-push.sh message "Mon message"
|
||||
git ssh-push "Mon message"
|
||||
git quick-push
|
||||
EOF
|
||||
|
||||
print_success "Fichier de configuration créé: .ssh-config"
|
||||
|
||||
# 8. Résumé de la configuration
|
||||
echo ""
|
||||
print_success "=== Configuration SSH terminée ==="
|
||||
echo ""
|
||||
echo "✅ Configuration Git pour SSH"
|
||||
echo "✅ Alias Git configurés"
|
||||
echo "✅ Remotes vérifiés"
|
||||
echo "✅ Scripts configurés"
|
||||
echo ""
|
||||
|
||||
if [[ "$SSH_WORKING" == "true" ]]; then
|
||||
print_success "SSH fonctionne correctement"
|
||||
echo ""
|
||||
echo "🚀 Vous pouvez maintenant utiliser :"
|
||||
echo " ./scripts/auto-ssh-push.sh quick"
|
||||
echo " ./scripts/auto-ssh-push.sh message \"Mon message\""
|
||||
echo " git ssh-push \"Mon message\""
|
||||
echo " git quick-push"
|
||||
echo ""
|
||||
else
|
||||
print_warning "SSH ne fonctionne pas encore"
|
||||
echo ""
|
||||
echo "🔧 Pour configurer SSH :"
|
||||
echo " 1. Générer une clé SSH : ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_4nk"
|
||||
echo " 2. Ajouter à l'agent SSH : ssh-add ~/.ssh/id_ed25519_4nk"
|
||||
echo " 3. Ajouter la clé publique à votre compte Gitea"
|
||||
echo " 4. Relancer ce script : ./scripts/init-ssh-env.sh"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# 9. Test final
|
||||
if [[ "$SSH_WORKING" == "true" ]]; then
|
||||
print_status "Test final de push SSH..."
|
||||
echo "💡 Pour tester, utilisez : ./scripts/auto-ssh-push.sh status"
|
||||
fi
|
||||
|
||||
print_success "Initialisation SSH terminée !"
|
348
scripts/integrate-4nk-node.sh
Executable file
348
scripts/integrate-4nk-node.sh
Executable file
@ -0,0 +1,348 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||||
TARGET_DIR="${PROJECT_ROOT}/../4NK_node"
|
||||
|
||||
# Couleurs pour l'affichage
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Fonction d'affichage
|
||||
print_info() {
|
||||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}✅ $1${NC}"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}❌ $1${NC}"
|
||||
}
|
||||
|
||||
# Fonction d'aide
|
||||
show_help() {
|
||||
echo "Usage: $0 [options]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " --target-dir DIR Répertoire cible 4NK_node (défaut: ../4NK_node)"
|
||||
echo " --dry-run Simulation sans modification"
|
||||
echo " --backup Créer une sauvegarde avant intégration"
|
||||
echo " --help Afficher cette aide"
|
||||
echo ""
|
||||
echo "Exemples:"
|
||||
echo " $0 # Intégration standard"
|
||||
echo " $0 --dry-run # Simulation"
|
||||
echo " $0 --target-dir /path/to/4NK_node"
|
||||
}
|
||||
|
||||
# Variables
|
||||
DRY_RUN=false
|
||||
BACKUP=false
|
||||
TARGET_DIR="${PROJECT_ROOT}/../4NK_node"
|
||||
|
||||
# Parsing des arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--target-dir)
|
||||
TARGET_DIR="$2"
|
||||
shift 2
|
||||
;;
|
||||
--dry-run)
|
||||
DRY_RUN=true
|
||||
shift
|
||||
;;
|
||||
--backup)
|
||||
BACKUP=true
|
||||
shift
|
||||
;;
|
||||
--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_error "Option inconnue: $1"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Vérification des prérequis
|
||||
check_prerequisites() {
|
||||
print_info "Vérification des prérequis..."
|
||||
|
||||
# Vérifier que nous sommes dans le bon répertoire
|
||||
if [[ ! -f "${PROJECT_ROOT}/package.json" ]]; then
|
||||
print_error "Ce script doit être exécuté depuis le répertoire ihm_client"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier que le répertoire cible existe
|
||||
if [[ ! -d "$TARGET_DIR" ]]; then
|
||||
print_error "Répertoire cible 4NK_node non trouvé: $TARGET_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier que les fichiers d'intégration existent
|
||||
local required_files=(
|
||||
"Dockerfile.4nk-node"
|
||||
"nginx.4nk-node.conf"
|
||||
"start-4nk-node.sh"
|
||||
"docker-compose.4nk-node.yml"
|
||||
)
|
||||
|
||||
for file in "${required_files[@]}"; do
|
||||
if [[ ! -f "${PROJECT_ROOT}/$file" ]]; then
|
||||
print_error "Fichier requis manquant: $file"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
print_success "Prérequis vérifiés"
|
||||
}
|
||||
|
||||
# Création de la sauvegarde
|
||||
create_backup() {
|
||||
if [[ "$BACKUP" == "true" ]]; then
|
||||
print_info "Création de la sauvegarde..."
|
||||
|
||||
local backup_dir="${TARGET_DIR}/backup_$(date +%Y%m%d_%H%M%S)"
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
mkdir -p "$backup_dir"
|
||||
cp -r "${TARGET_DIR}/docker-compose.yml" "$backup_dir/" 2>/dev/null || true
|
||||
cp -r "${TARGET_DIR}/ihm_client" "$backup_dir/" 2>/dev/null || true
|
||||
print_success "Sauvegarde créée: $backup_dir"
|
||||
else
|
||||
print_info "DRY RUN: Sauvegarde serait créée: $backup_dir"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Création du répertoire ihm_client dans 4NK_node
|
||||
create_ihm_client_directory() {
|
||||
print_info "Création du répertoire ihm_client dans 4NK_node..."
|
||||
|
||||
local ihm_client_dir="${TARGET_DIR}/ihm_client"
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
mkdir -p "$ihm_client_dir"
|
||||
print_success "Répertoire créé: $ihm_client_dir"
|
||||
else
|
||||
print_info "DRY RUN: Répertoire serait créé: $ihm_client_dir"
|
||||
fi
|
||||
}
|
||||
|
||||
# Copie des fichiers d'intégration
|
||||
copy_integration_files() {
|
||||
print_info "Copie des fichiers d'intégration..."
|
||||
|
||||
local files_to_copy=(
|
||||
"Dockerfile.4nk-node:Dockerfile"
|
||||
"nginx.4nk-node.conf:nginx.conf"
|
||||
"start-4nk-node.sh:start.sh"
|
||||
"package.json:package.json"
|
||||
"tsconfig.json:tsconfig.json"
|
||||
"vite.config.ts:vite.config.ts"
|
||||
"index.html:index.html"
|
||||
)
|
||||
|
||||
for file_mapping in "${files_to_copy[@]}"; do
|
||||
local source_file=$(echo "$file_mapping" | cut -d: -f1)
|
||||
local target_file=$(echo "$file_mapping" | cut -d: -f2)
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
cp "${PROJECT_ROOT}/$source_file" "${TARGET_DIR}/ihm_client/$target_file"
|
||||
print_success "Copié: $source_file -> ihm_client/$target_file"
|
||||
else
|
||||
print_info "DRY RUN: Copié: $source_file -> ihm_client/$target_file"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Copie du code source
|
||||
copy_source_code() {
|
||||
print_info "Copie du code source..."
|
||||
|
||||
local source_dirs=("src" "public")
|
||||
|
||||
for dir in "${source_dirs[@]}"; do
|
||||
if [[ -d "${PROJECT_ROOT}/$dir" ]]; then
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
cp -r "${PROJECT_ROOT}/$dir" "${TARGET_DIR}/ihm_client/"
|
||||
print_success "Copié: $dir/"
|
||||
else
|
||||
print_info "DRY RUN: Copié: $dir/"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Mise à jour du docker-compose.yml
|
||||
update_docker_compose() {
|
||||
print_info "Mise à jour du docker-compose.yml..."
|
||||
|
||||
local docker_compose_file="${TARGET_DIR}/docker-compose.yml"
|
||||
local ihm_client_service="
|
||||
ihm_client:
|
||||
build:
|
||||
context: ./ihm_client
|
||||
dockerfile: Dockerfile
|
||||
container_name: 4nk-ihm-client
|
||||
ports:
|
||||
- \"8080:80\"
|
||||
environment:
|
||||
- SDK_RELAY_WS_URL=ws://sdk_relay_1:8090
|
||||
- SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091
|
||||
- BITCOIN_RPC_URL=http://bitcoin:18443
|
||||
- BLINDBIT_URL=http://blindbit:8000
|
||||
volumes:
|
||||
- ihm_client_logs:/var/log/nginx
|
||||
networks:
|
||||
- btcnet
|
||||
depends_on:
|
||||
- sdk_relay_1
|
||||
- sdk_relay_2
|
||||
- sdk_relay_3
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: [\"CMD\", \"wget\", \"--quiet\", \"--tries=1\", \"--timeout=5\", \"--spider\", \"http://localhost\"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s"
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
# Vérifier si le service existe déjà
|
||||
if grep -q "ihm_client:" "$docker_compose_file" 2>/dev/null; then
|
||||
print_warning "Service ihm_client existe déjà dans docker-compose.yml"
|
||||
else
|
||||
# Ajouter le service avant la section volumes
|
||||
sed -i "/^volumes:/i\\$ihm_client_service" "$docker_compose_file"
|
||||
|
||||
# Ajouter les volumes ihm_client
|
||||
sed -i '/^volumes:/a\ ihm_client_logs:\n driver: local' "$docker_compose_file"
|
||||
|
||||
print_success "Service ihm_client ajouté au docker-compose.yml"
|
||||
fi
|
||||
else
|
||||
print_info "DRY RUN: Service ihm_client serait ajouté au docker-compose.yml"
|
||||
fi
|
||||
}
|
||||
|
||||
# Création du script de démarrage
|
||||
create_startup_script() {
|
||||
print_info "Création du script de démarrage..."
|
||||
|
||||
local startup_script="${TARGET_DIR}/start-ihm-client.sh"
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
cat > "$startup_script" << 'EOF'
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Démarrage de l'interface utilisateur 4NK..."
|
||||
|
||||
# Vérifier que nous sommes dans le bon répertoire
|
||||
if [[ ! -f "docker-compose.yml" ]]; then
|
||||
echo "❌ Ce script doit être exécuté depuis le répertoire 4NK_node"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Démarrer uniquement le service ihm_client
|
||||
echo "📦 Démarrage du service ihm_client..."
|
||||
docker-compose up -d ihm_client
|
||||
|
||||
# Attendre que le service soit prêt
|
||||
echo "⏳ Attente du démarrage..."
|
||||
sleep 10
|
||||
|
||||
# Vérifier la santé du service
|
||||
if docker-compose ps ihm_client | grep -q "Up"; then
|
||||
echo "✅ Interface utilisateur démarrée avec succès"
|
||||
echo " 📍 URL: http://localhost:8080"
|
||||
echo " 🔍 Logs: docker logs 4nk-ihm-client"
|
||||
else
|
||||
echo "❌ Échec du démarrage de l'interface utilisateur"
|
||||
docker-compose logs ihm_client
|
||||
exit 1
|
||||
fi
|
||||
EOF
|
||||
|
||||
chmod +x "$startup_script"
|
||||
print_success "Script de démarrage créé: $startup_script"
|
||||
else
|
||||
print_info "DRY RUN: Script de démarrage serait créé: $startup_script"
|
||||
fi
|
||||
}
|
||||
|
||||
# Validation de l'intégration
|
||||
validate_integration() {
|
||||
print_info "Validation de l'intégration..."
|
||||
|
||||
local validation_files=(
|
||||
"${TARGET_DIR}/ihm_client/Dockerfile"
|
||||
"${TARGET_DIR}/ihm_client/nginx.conf"
|
||||
"${TARGET_DIR}/ihm_client/start.sh"
|
||||
"${TARGET_DIR}/docker-compose.yml"
|
||||
)
|
||||
|
||||
for file in "${validation_files[@]}"; do
|
||||
if [[ -f "$file" ]]; then
|
||||
print_success "Validé: $(basename "$file")"
|
||||
else
|
||||
print_error "Fichier manquant: $(basename "$file")"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
|
||||
print_success "Validation terminée"
|
||||
}
|
||||
|
||||
# Fonction principale
|
||||
main() {
|
||||
echo "🔧 Intégration de ihm_client dans 4NK_node"
|
||||
echo " Source: $PROJECT_ROOT"
|
||||
echo " Cible: $TARGET_DIR"
|
||||
echo " Mode: $([ "$DRY_RUN" == "true" ] && echo "DRY RUN" || echo "EXÉCUTION")"
|
||||
echo ""
|
||||
|
||||
check_prerequisites
|
||||
create_backup
|
||||
create_ihm_client_directory
|
||||
copy_integration_files
|
||||
copy_source_code
|
||||
update_docker_compose
|
||||
create_startup_script
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
validate_integration
|
||||
echo ""
|
||||
print_success "Intégration terminée avec succès !"
|
||||
echo ""
|
||||
echo "📋 Prochaines étapes:"
|
||||
echo " 1. Aller dans le répertoire 4NK_node: cd $TARGET_DIR"
|
||||
echo " 2. Démarrer l'interface: ./start-ihm-client.sh"
|
||||
echo " 3. Ou redémarrer tout: ./restart_4nk_node.sh"
|
||||
echo " 4. Accéder à l'interface: http://localhost:8080"
|
||||
else
|
||||
echo ""
|
||||
print_success "Simulation terminée - Aucune modification effectuée"
|
||||
fi
|
||||
}
|
||||
|
||||
# Exécution
|
||||
main "$@"
|
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 ==="
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user