push-guardian 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +15 -0
- package/.pushguardian-plugins.json +10 -0
- package/Dockerfile +41 -0
- package/Dockerfile.dev +20 -0
- package/README.md +386 -0
- package/TECHNO.md +139 -0
- package/babel.config.js +1 -0
- package/developper_utils.md +119 -0
- package/docker-compose.yml +41 -0
- package/docs/PLUGINS.md +223 -0
- package/docs/technical/architecture.md +298 -0
- package/docs/technical/performance-guide.md +390 -0
- package/docs/technical/plugin-persistence.md +169 -0
- package/docs/technical/plugins-guide.md +409 -0
- package/jest.config.js +22 -0
- package/package.json +53 -0
- package/plugins/example-plugin/index.js +55 -0
- package/plugins/example-plugin/plugin.json +8 -0
- package/scripts/coverage-report.js +75 -0
- package/src/cli/command/config.js +33 -0
- package/src/cli/command/install.js +137 -0
- package/src/cli/command/mirror.js +90 -0
- package/src/cli/command/performance.js +160 -0
- package/src/cli/command/plugin.js +171 -0
- package/src/cli/command/security.js +152 -0
- package/src/cli/command/shell.js +238 -0
- package/src/cli/command/validate.js +54 -0
- package/src/cli/index.js +23 -0
- package/src/cli/install/codeQualityTools.js +156 -0
- package/src/cli/install/hooks.js +89 -0
- package/src/cli/install/mirroring.js +299 -0
- package/src/core/codeQualityTools/configAnalyzer.js +216 -0
- package/src/core/codeQualityTools/configGenerator.js +381 -0
- package/src/core/codeQualityTools/configManager.js +65 -0
- package/src/core/codeQualityTools/fileDetector.js +62 -0
- package/src/core/codeQualityTools/languageTools.js +104 -0
- package/src/core/codeQualityTools/toolInstaller.js +53 -0
- package/src/core/configManager.js +43 -0
- package/src/core/errorCMD.js +9 -0
- package/src/core/interactiveMenu/interactiveMenu.js +73 -0
- package/src/core/mirroring/branchSynchronizer.js +59 -0
- package/src/core/mirroring/generate.js +114 -0
- package/src/core/mirroring/repoManager.js +112 -0
- package/src/core/mirroring/syncManager.js +176 -0
- package/src/core/module/env-loader.js +109 -0
- package/src/core/performance/metricsCollector.js +217 -0
- package/src/core/performance/performanceAnalyzer.js +182 -0
- package/src/core/plugins/basePlugin.js +89 -0
- package/src/core/plugins/pluginManager.js +123 -0
- package/src/core/plugins/pluginRegistry.js +215 -0
- package/src/core/validator.js +53 -0
- package/src/hooks/constrains/constrains.js +174 -0
- package/src/hooks/constrains/constraintEngine.js +140 -0
- package/src/utils/chalk-wrapper.js +26 -0
- package/src/utils/exec-wrapper.js +6 -0
- package/tests/fixtures/mock-eslint-config-array.js +8 -0
- package/tests/fixtures/mock-eslint-config-single.js +6 -0
- package/tests/fixtures/mockLoadedPlugin.js +11 -0
- package/tests/setup.js +28 -0
- package/tests/unit/basePlugin.test.js +355 -0
- package/tests/unit/branchSynchronizer.test.js +308 -0
- package/tests/unit/cli-commands.test.js +144 -0
- package/tests/unit/codeQualityConfigManager.test.js +233 -0
- package/tests/unit/codeQualityTools.test.js +36 -0
- package/tests/unit/command-install.test.js +247 -0
- package/tests/unit/command-mirror.test.js +179 -0
- package/tests/unit/command-performance.test.js +169 -0
- package/tests/unit/command-plugin.test.js +288 -0
- package/tests/unit/command-security.test.js +277 -0
- package/tests/unit/command-shell.test.js +325 -0
- package/tests/unit/configAnalyzer.test.js +593 -0
- package/tests/unit/configGenerator.test.js +808 -0
- package/tests/unit/configManager.test.js +195 -0
- package/tests/unit/constrains.test.js +463 -0
- package/tests/unit/constraint.test.js +554 -0
- package/tests/unit/env-loader.test.js +279 -0
- package/tests/unit/fileDetector.test.js +171 -0
- package/tests/unit/install-codeQualityTools.test.js +343 -0
- package/tests/unit/install-hooks.test.js +280 -0
- package/tests/unit/install-mirroring.test.js +731 -0
- package/tests/unit/install-modules.test.js +81 -0
- package/tests/unit/interactiveMenu.test.js +426 -0
- package/tests/unit/languageTools.test.js +244 -0
- package/tests/unit/metricsCollector.test.js +354 -0
- package/tests/unit/mirroring-generate.test.js +96 -0
- package/tests/unit/modules-exist.test.js +96 -0
- package/tests/unit/performanceAnalyzer.test.js +473 -0
- package/tests/unit/pluginManager.test.js +427 -0
- package/tests/unit/pluginRegistry.test.js +592 -0
- package/tests/unit/repoManager.test.js +469 -0
- package/tests/unit/reviewAppManager.test.js +5 -0
- package/tests/unit/security-command.test.js +43 -0
- package/tests/unit/syncManager.test.js +494 -0
- package/tests/unit/toolInstaller.test.js +240 -0
- package/tests/unit/utils.test.js +144 -0
- package/tests/unit/validator.test.js +215 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# **Documentation Développeur push-guardian**
|
|
2
|
+
|
|
3
|
+
push-guardian est un outil CLI basé sur Node.js pour la validation automatisée de la qualité du code et la gestion des hooks Git. Ce document explique son architecture, ses composants et comment l'étendre.
|
|
4
|
+
|
|
5
|
+
## **Vue d'ensemble de l'architecture**
|
|
6
|
+
|
|
7
|
+
push-guardian suit une architecture modulaire avec une séparation claire des préoccupations :
|
|
8
|
+
|
|
9
|
+
- **Couche CLI** : Analyse des commandes et interaction utilisateur
|
|
10
|
+
- **Couche Core** : Logique métier et moteurs de validation
|
|
11
|
+
- **Couche Hooks** : Intégration Git et validation des contraintes
|
|
12
|
+
- **Couche Utils** : Utilitaires partagés
|
|
13
|
+
|
|
14
|
+
## **Composants principaux**
|
|
15
|
+
|
|
16
|
+
Point d'entrée CLI
|
|
17
|
+
Le point d'entrée principal est index.js, qui utilise Commander.js pour définir les commandes. Les commandes sont chargées dynamiquement depuis command.
|
|
18
|
+
|
|
19
|
+
Structure d'exemple de commande :
|
|
20
|
+
|
|
21
|
+
```js
|
|
22
|
+
module.exports = {
|
|
23
|
+
name: 'example',
|
|
24
|
+
description: 'Commande exemple',
|
|
25
|
+
options: [{ flags: '-v, --verbose', description: 'Sortie verbeuse' }],
|
|
26
|
+
action: async (options) => {
|
|
27
|
+
// Logique de commande
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Gestion de la configuration
|
|
33
|
+
La configuration est gérée par configManager.js, qui charge/sauvegarde `push-guardian.config.json.`
|
|
34
|
+
|
|
35
|
+
Fonctions clés :
|
|
36
|
+
|
|
37
|
+
- **loadConfig()** : Charge la configuration avec des valeurs par défaut
|
|
38
|
+
- **saveConfig(config)** : Sauvegarde la configuration mise à jour
|
|
39
|
+
|
|
40
|
+
Moteur de validation
|
|
41
|
+
La logique de validation principale est dans validator.js, qui orchestre les exécutions ESLint et les validations de hooks.
|
|
42
|
+
|
|
43
|
+
Moteur de contraintes
|
|
44
|
+
Les contraintes sont gérées par constraintEngine.js, un système flexible pour valider les messages et les branches.
|
|
45
|
+
|
|
46
|
+
Pour ajouter une nouvelle contrainte :
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
this.constraints.set('newConstraint', (value, param) => {
|
|
50
|
+
// Logique de validation
|
|
51
|
+
return value.length > param;
|
|
52
|
+
});
|
|
53
|
+
this.errorMessages.newConstraint = (param) => `Le message doit être plus long que ${param} caractères`;
|
|
54
|
+
```
|
|
55
|
+
Intégration des hooks Git
|
|
56
|
+
Les hooks sont définis dans constrains.js, supportant les hooks commit-msg, post-checkout et pre-push.
|
|
57
|
+
|
|
58
|
+
Flux de validation des hooks :
|
|
59
|
+
|
|
60
|
+
1. Charger la config pour le hook
|
|
61
|
+
2. Appliquer les contraintes via constraintEngine.validate()
|
|
62
|
+
3. Quitter avec une erreur si la validation échoue
|
|
63
|
+
|
|
64
|
+
Pour ajouter un nouveau langage :
|
|
65
|
+
|
|
66
|
+
```js
|
|
67
|
+
const LANGUAGE_TOOLS = {
|
|
68
|
+
'Nouveau Langage': {
|
|
69
|
+
packages: ['eslint-plugin-newlang'],
|
|
70
|
+
setup: setupNewLanguage
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Utilitaires
|
|
76
|
+
Utilitaires partagés incluent :
|
|
77
|
+
|
|
78
|
+
- **exec-wrapper.js** : Wrapper d'exécution de commandes asynchrones
|
|
79
|
+
- **chalk-wrapper.js** : Sortie colorisée avec fallback
|
|
80
|
+
|
|
81
|
+
## **Tests**
|
|
82
|
+
Les tests sont dans unit utilisant Jest. Lancez avec `npm test`.
|
|
83
|
+
|
|
84
|
+
Exemple de test pour le moteur de contraintes :
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
describe('Moteur de Contraintes', () => {
|
|
88
|
+
test('valide correctement', () => {
|
|
89
|
+
// Logique de test
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
## **Étendre push-guardian**
|
|
94
|
+
|
|
95
|
+
Ajouter une nouvelle commande
|
|
96
|
+
|
|
97
|
+
1. Créer un nouveau fichier dans command
|
|
98
|
+
2. Exporter l'objet commande comme montré ci-dessus
|
|
99
|
+
3. Il sera automatiquement chargé par index.js
|
|
100
|
+
|
|
101
|
+
Ajouter un nouveau type de hook
|
|
102
|
+
|
|
103
|
+
1. Mettre à jour constrains.js pour gérer le nouveau hook
|
|
104
|
+
2. Ajouter le support de configuration dans configManager.js
|
|
105
|
+
|
|
106
|
+
Contraintes personnalisées
|
|
107
|
+
Utilisez constraintEngine.addConstraint() pour enregistrer de nouveaux validateurs.
|
|
108
|
+
|
|
109
|
+
## **Gestion des erreurs**
|
|
110
|
+
Les erreurs sont centralisées dans errorCMD.js, qui formate et quitte avec les traces de pile.
|
|
111
|
+
|
|
112
|
+
## **Workflow de développement**
|
|
113
|
+
|
|
114
|
+
1. Installer les dépendances : npm install
|
|
115
|
+
2. Lancer les tests : npm test
|
|
116
|
+
3. Lier pour le développement : npm link
|
|
117
|
+
4. Construire/vérifier : Utiliser ESLint via npx push-guardian validate
|
|
118
|
+
|
|
119
|
+
Pour plus de détails, voir le `README.md` principal et `TECHNO.md`.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
services:
|
|
2
|
+
push-guardian:
|
|
3
|
+
build:
|
|
4
|
+
context: .
|
|
5
|
+
dockerfile: Dockerfile
|
|
6
|
+
container_name: push-guardian
|
|
7
|
+
user: "${UID:-1000}:${GID:-1000}"
|
|
8
|
+
volumes:
|
|
9
|
+
# Monter le projet à valider
|
|
10
|
+
- ./:/workspace
|
|
11
|
+
# Monter la config git
|
|
12
|
+
- ~/.gitconfig:/home/push-guardian/.gitconfig:ro
|
|
13
|
+
working_dir: /workspace
|
|
14
|
+
environment:
|
|
15
|
+
- NODE_ENV=production
|
|
16
|
+
- TOKEN=${TOKEN:-}
|
|
17
|
+
- GITLAB_TOKEN=${GITLAB_TOKEN:-}
|
|
18
|
+
- AZURE_DEVOPS_URL=${AZURE_DEVOPS_URL:-}
|
|
19
|
+
- AZURE_DEVOPS_TOKEN=${AZURE_DEVOPS_TOKEN:-}
|
|
20
|
+
command: validate
|
|
21
|
+
|
|
22
|
+
# Service pour tests
|
|
23
|
+
test:
|
|
24
|
+
build:
|
|
25
|
+
context: .
|
|
26
|
+
dockerfile: Dockerfile.dev
|
|
27
|
+
volumes:
|
|
28
|
+
- ./:/app
|
|
29
|
+
- /app/node_modules
|
|
30
|
+
command: npm test
|
|
31
|
+
|
|
32
|
+
# Service pour couverture
|
|
33
|
+
coverage:
|
|
34
|
+
build:
|
|
35
|
+
context: .
|
|
36
|
+
dockerfile: Dockerfile.dev
|
|
37
|
+
volumes:
|
|
38
|
+
- ./:/app
|
|
39
|
+
- /app/node_modules
|
|
40
|
+
- ./coverage:/app/coverage
|
|
41
|
+
command: npm run test:coverage
|
package/docs/PLUGINS.md
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Système de Plugins push-guardian v2
|
|
2
|
+
|
|
3
|
+
Le système de plugins push-guardian v2 permet d'étendre les fonctionnalités via des commandes personnalisées.
|
|
4
|
+
|
|
5
|
+
## Caractéristiques
|
|
6
|
+
|
|
7
|
+
- **Commandes uniquement** : Les plugins enregistrent des commandes CLI (pas de hooks Git)
|
|
8
|
+
- **Gestion locale** : Plugins créés et gérés localement dans le dossier `plugins/`
|
|
9
|
+
- **Enable/Disable** : Activation/désactivation sans suppression
|
|
10
|
+
|
|
11
|
+
## Utilisation
|
|
12
|
+
|
|
13
|
+
### Lister les plugins installés
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
push-guardian plugin list
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Activer/Désactiver un plugin
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
push-guardian plugin enable <nom-du-plugin>
|
|
23
|
+
push-guardian plugin disable <nom-du-plugin>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Lister les commandes disponibles
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
push-guardian plugin commands
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Exécuter une commande de plugin
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
push-guardian plugin run <nom-du-plugin> <commande> [args...]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Exemple avec le plugin d'exemple :
|
|
39
|
+
```bash
|
|
40
|
+
push-guardian plugin run example-plugin hello
|
|
41
|
+
push-guardian plugin run example-plugin greet "John"
|
|
42
|
+
push-guardian plugin run example-plugin info
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Créer un plugin
|
|
46
|
+
|
|
47
|
+
### Structure du plugin
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
mon-plugin/
|
|
51
|
+
├── plugin.json
|
|
52
|
+
└── index.js
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### plugin.json
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"name": "mon-plugin",
|
|
60
|
+
"version": "1.0.0",
|
|
61
|
+
"description": "Description de mon plugin",
|
|
62
|
+
"author": "Votre Nom",
|
|
63
|
+
"main": "index.js",
|
|
64
|
+
"commands": ["ma-commande", "autre-commande"]
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### index.js
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
const BasePlugin = require('../../src/core/plugins/basePlugin');
|
|
72
|
+
const { getChalk } = require('../../src/utils/chalk-wrapper');
|
|
73
|
+
const chalk = getChalk();
|
|
74
|
+
|
|
75
|
+
class MonPlugin extends BasePlugin {
|
|
76
|
+
constructor(manifest) {
|
|
77
|
+
super(manifest);
|
|
78
|
+
this.setupCommands();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
setupCommands() {
|
|
82
|
+
this.registerCommand('ma-commande', async (args, options) => {
|
|
83
|
+
console.log(chalk.green('Ma commande s\'exécute!'));
|
|
84
|
+
return 'Résultat de la commande';
|
|
85
|
+
}, {
|
|
86
|
+
description: 'Description de ma commande',
|
|
87
|
+
args: []
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
this.registerCommand('autre-commande', async (args, options) => {
|
|
91
|
+
const param = args[0];
|
|
92
|
+
console.log(chalk.cyan(`Paramètre reçu: ${param}`));
|
|
93
|
+
return `Traité: ${param}`;
|
|
94
|
+
}, {
|
|
95
|
+
description: 'Commande avec un argument',
|
|
96
|
+
args: ['parametre']
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
module.exports = MonPlugin;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Configuration locale
|
|
105
|
+
|
|
106
|
+
Le fichier `.push-guardian-plugins.json` stocke la configuration locale :
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"plugins": {
|
|
111
|
+
"example-plugin": {
|
|
112
|
+
"path": "plugins/example-plugin",
|
|
113
|
+
"version": "1.0.0",
|
|
114
|
+
"enabled": true,
|
|
115
|
+
"installedAt": "2024-01-15T10:30:00.000Z"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Architecture
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
push-guardian
|
|
125
|
+
│
|
|
126
|
+
├── src/core/
|
|
127
|
+
│ └── plugins/
|
|
128
|
+
│ ├── basePlugin.js # Classe de base
|
|
129
|
+
│ ├── pluginRegistry.js # Registre local
|
|
130
|
+
│ └── pluginManager.js # Gestionnaire d'exécution
|
|
131
|
+
│
|
|
132
|
+
├── src/cli/command/
|
|
133
|
+
│ └── plugin.js # Commande CLI
|
|
134
|
+
│
|
|
135
|
+
└── plugins/ # Plugins créés localement
|
|
136
|
+
└── example-plugin/
|
|
137
|
+
├── plugin.json
|
|
138
|
+
└── index.js
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Notes importantes
|
|
142
|
+
|
|
143
|
+
- Les plugins sont des **extensions de commandes** uniquement
|
|
144
|
+
- Ils **ne s'exécutent pas automatiquement** lors des hooks Git
|
|
145
|
+
- Utilisez `push-guardian plugin run <plugin> <commande>` pour les exécuter
|
|
146
|
+
- La désactivation d'un plugin empêche l'exécution de ses commandes
|
|
147
|
+
- Le manifest (`plugin.json`) est obligatoire et doit contenir : name, version, description, author, main
|
|
148
|
+
- Les plugins sont créés localement dans le dossier `plugins/` à la racine du projet
|
|
149
|
+
|
|
150
|
+
### BasePlugin
|
|
151
|
+
|
|
152
|
+
Classe de base que tous les plugins doivent étendre.
|
|
153
|
+
|
|
154
|
+
**Constructeur**
|
|
155
|
+
- `constructor(manifest)` : Reçoit le manifest (plugin.json)
|
|
156
|
+
|
|
157
|
+
**Méthodes**
|
|
158
|
+
- `registerCommand(name, handler, options)` : Enregistre une commande
|
|
159
|
+
- `name` : Nom de la commande
|
|
160
|
+
- `handler` : Fonction async (args, options) => résultat
|
|
161
|
+
- `options.description` : Description de la commande
|
|
162
|
+
- `options.args` : Tableau des noms d'arguments
|
|
163
|
+
|
|
164
|
+
- `executeCommand(commandName, args, options)` : Exécute une commande
|
|
165
|
+
- `getManifest()` : Retourne le manifest du plugin
|
|
166
|
+
- `cleanup()` : Nettoie les ressources (appelé à la désinstallation)
|
|
167
|
+
|
|
168
|
+
**Propriétés**
|
|
169
|
+
- `name` : Nom du plugin
|
|
170
|
+
- `version` : Version du plugin
|
|
171
|
+
- `description` : Description du plugin
|
|
172
|
+
- `author` : Auteur du plugin
|
|
173
|
+
- `enabled` : État du plugin (actif/inactif)
|
|
174
|
+
- `commands` : Map des commandes enregistrées
|
|
175
|
+
|
|
176
|
+
## Configuration locale
|
|
177
|
+
|
|
178
|
+
Le fichier `.push-guardian-plugins.json` stocke la configuration locale :
|
|
179
|
+
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"plugins": {
|
|
183
|
+
"example-plugin": {
|
|
184
|
+
"path": "example-plugin",
|
|
185
|
+
"version": "1.0.0",
|
|
186
|
+
"enabled": true,
|
|
187
|
+
"installedAt": "2024-01-15T10:30:00.000Z"
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Architecture
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
push-guardian
|
|
197
|
+
│
|
|
198
|
+
├── src/core/
|
|
199
|
+
│ ├── api/
|
|
200
|
+
│ │ └── pluginApiClient.js # Client API pour le dépôt
|
|
201
|
+
│ └── plugins/
|
|
202
|
+
│ ├── basePlugin.js # Classe de base
|
|
203
|
+
│ ├── pluginRegistry.js # Registre local
|
|
204
|
+
│ ├── pluginManager.js # Gestionnaire d'exécution
|
|
205
|
+
│ ├── pluginInstaller.js # Installation/désinstallation
|
|
206
|
+
│ └── pluginPublisher.js # Publication
|
|
207
|
+
│
|
|
208
|
+
├── src/cli/command/
|
|
209
|
+
│ └── plugin.js # Commande CLI
|
|
210
|
+
│
|
|
211
|
+
└── plugins/ # Plugins installés
|
|
212
|
+
└── example-plugin/
|
|
213
|
+
├── plugin.json
|
|
214
|
+
└── index.js
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Notes importantes
|
|
218
|
+
|
|
219
|
+
- Les plugins sont des **extensions de commandes** uniquement
|
|
220
|
+
- Ils **ne s'exécutent pas automatiquement** lors des hooks Git
|
|
221
|
+
- Utilisez `push-guardian plugin run <plugin> <commande>` pour les exécuter
|
|
222
|
+
- La désactivation d'un plugin empêche l'exécution de ses commandes
|
|
223
|
+
- Le manifest (`plugin.json`) est obligatoire et doit contenir : name, version, description, author, main
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# Architecture push-guardian
|
|
2
|
+
|
|
3
|
+
## Vue d'ensemble
|
|
4
|
+
|
|
5
|
+
push-guardian est un outil de validation de code et de gestion de workflow Git structuré en modules indépendants.
|
|
6
|
+
|
|
7
|
+
## Structure du projet
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
push-guardian/
|
|
11
|
+
├── src/
|
|
12
|
+
│ ├── cli/ # Interface en ligne de commande
|
|
13
|
+
│ │ ├── index.js # Point d'entrée CLI
|
|
14
|
+
│ │ ├── command/ # Commandes CLI
|
|
15
|
+
│ │ └── install/ # Scripts d'installation
|
|
16
|
+
│ ├── core/ # Logique métier
|
|
17
|
+
│ │ ├── cache/ # Système de cache
|
|
18
|
+
│ │ ├── codeQualityTools/ # Outils de qualité de code
|
|
19
|
+
│ │ ├── interactiveMenu/ # Menus interactifs
|
|
20
|
+
│ │ ├── mirroring/ # Système de mirroring
|
|
21
|
+
│ │ ├── performance/ # Analyse de performance
|
|
22
|
+
│ │ ├── plugins/ # Système de plugins
|
|
23
|
+
│ │ └── reviewApps/ # Review apps pour PR
|
|
24
|
+
│ ├── hooks/ # Hooks Git
|
|
25
|
+
│ └── utils/ # Utilitaires
|
|
26
|
+
├── tests/ # Tests unitaires
|
|
27
|
+
└── docs/ # Documentation
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Modules principaux
|
|
32
|
+
|
|
33
|
+
### 1. CLI (Command Line Interface)
|
|
34
|
+
|
|
35
|
+
Le module CLI fournit l'interface utilisateur en ligne de commande.
|
|
36
|
+
|
|
37
|
+
**Fichiers clés:**
|
|
38
|
+
- `src/cli/index.js` - Point d'entrée principal
|
|
39
|
+
- `src/cli/command/*.js` - Commandes disponibles
|
|
40
|
+
|
|
41
|
+
**Commandes disponibles:**
|
|
42
|
+
- `config` - Gestion de la configuration
|
|
43
|
+
- `install` - Installation des modules
|
|
44
|
+
- `mirror` - Gestion du mirroring
|
|
45
|
+
- `security` - Analyse de sécurité
|
|
46
|
+
- `validate` - Validation du code
|
|
47
|
+
- `plugin` - Gestion des plugins
|
|
48
|
+
- `performance` - Analyse de performance
|
|
49
|
+
|
|
50
|
+
### 2. Code Quality Tools
|
|
51
|
+
|
|
52
|
+
Module de gestion de la qualité du code (ESLint, Prettier, etc.).
|
|
53
|
+
|
|
54
|
+
**Composants:**
|
|
55
|
+
- `configAnalyzer.js` - Analyse des configurations existantes
|
|
56
|
+
- `configGenerator.js` - Génération de configurations
|
|
57
|
+
- `configManager.js` - Gestion globale des configs
|
|
58
|
+
- `fileDetector.js` - Détection de fichiers
|
|
59
|
+
- `languageTools.js` - Outils par langage
|
|
60
|
+
- `toolInstaller.js` - Installation d'outils
|
|
61
|
+
|
|
62
|
+
### 3. Mirroring
|
|
63
|
+
|
|
64
|
+
Système de synchronisation multi-plateformes (GitHub, GitLab, BitBucket, Azure).
|
|
65
|
+
|
|
66
|
+
**Composants:**
|
|
67
|
+
- `branchSynchronizer.js` - Synchronisation de branches
|
|
68
|
+
- `generate.js` - Génération de workflows
|
|
69
|
+
- `repoManager.js` - Gestion des dépôts
|
|
70
|
+
- `syncManager.js` - Orchestration de la synchro
|
|
71
|
+
|
|
72
|
+
### 4. Plugins
|
|
73
|
+
|
|
74
|
+
Architecture modulaire permettant l'extension des fonctionnalités.
|
|
75
|
+
|
|
76
|
+
**Composants:**
|
|
77
|
+
- `basePlugin.js` - Classe de base pour plugins
|
|
78
|
+
- `pluginRegistry.js` - Registre central
|
|
79
|
+
- `pluginManager.js` - Gestionnaire de plugins
|
|
80
|
+
|
|
81
|
+
**Hooks disponibles:**
|
|
82
|
+
- `pre-validate` - Avant validation
|
|
83
|
+
- `post-validate` - Après validation
|
|
84
|
+
- `pre-commit` - Avant commit
|
|
85
|
+
- `post-commit` - Après commit
|
|
86
|
+
|
|
87
|
+
### 5. Performance
|
|
88
|
+
|
|
89
|
+
Système d'analyse et de collecte de métriques de performance.
|
|
90
|
+
|
|
91
|
+
**Composants:**
|
|
92
|
+
- `metricsCollector.js` - Collecte de métriques
|
|
93
|
+
- `performanceAnalyzer.js` - Analyse et rapports
|
|
94
|
+
- `performanceReporter.js` - Génération de rapports
|
|
95
|
+
|
|
96
|
+
### 6. Cache
|
|
97
|
+
|
|
98
|
+
Système de cache multiniveau (mémoire + disque).
|
|
99
|
+
|
|
100
|
+
**Composants:**
|
|
101
|
+
- `cacheManager.js` - Gestionnaire principal
|
|
102
|
+
- `cacheStrategy.js` - Stratégies (LRU, TTL)
|
|
103
|
+
|
|
104
|
+
**Stratégies:**
|
|
105
|
+
- LRU (Least Recently Used) - Cache en mémoire
|
|
106
|
+
- TTL (Time To Live) - Cache avec expiration
|
|
107
|
+
|
|
108
|
+
### 7. Review Apps
|
|
109
|
+
|
|
110
|
+
Système de déploiement temporaire pour les Pull Requests.
|
|
111
|
+
|
|
112
|
+
**Composants:**
|
|
113
|
+
- `reviewAppManager.js` - Gestion des déploiements
|
|
114
|
+
- `prIntegration.js` - Intégration GitHub/GitLab
|
|
115
|
+
|
|
116
|
+
**Providers supportés:**
|
|
117
|
+
- Local
|
|
118
|
+
- Docker
|
|
119
|
+
- Vercel
|
|
120
|
+
- Netlify
|
|
121
|
+
|
|
122
|
+
## Flux de données
|
|
123
|
+
|
|
124
|
+
### Validation de code
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Commit Git
|
|
128
|
+
↓
|
|
129
|
+
Hook pre-commit
|
|
130
|
+
↓
|
|
131
|
+
Validation push-guardian
|
|
132
|
+
↓
|
|
133
|
+
├─ Cache check
|
|
134
|
+
├─ Plugin hooks (pre-validate)
|
|
135
|
+
├─ ESLint/Prettier
|
|
136
|
+
├─ Tests
|
|
137
|
+
├─ Contraintes
|
|
138
|
+
└─ Plugin hooks (post-validate)
|
|
139
|
+
↓
|
|
140
|
+
Métriques de performance
|
|
141
|
+
↓
|
|
142
|
+
Résultat (success/failure)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Mirroring
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
Push sur GitHub
|
|
149
|
+
↓
|
|
150
|
+
GitHub Action (workflow)
|
|
151
|
+
↓
|
|
152
|
+
SyncManager
|
|
153
|
+
↓
|
|
154
|
+
├─ BranchSynchronizer
|
|
155
|
+
├─ RepoManager
|
|
156
|
+
└─ API calls (GitLab, etc.)
|
|
157
|
+
↓
|
|
158
|
+
Synchronisation complète
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Review Apps
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
Pull Request créée
|
|
165
|
+
↓
|
|
166
|
+
PR Integration détecte la PR
|
|
167
|
+
↓
|
|
168
|
+
ReviewAppManager
|
|
169
|
+
↓
|
|
170
|
+
├─ Création du déploiement
|
|
171
|
+
├─ Build de l'app
|
|
172
|
+
├─ Déploiement (Vercel/Netlify/Docker)
|
|
173
|
+
└─ Commentaire sur PR avec URL
|
|
174
|
+
↓
|
|
175
|
+
Review App accessible
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Configuration
|
|
179
|
+
|
|
180
|
+
### Fichier principal: `push-guardian.config.json`
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"codeQualityTools": {
|
|
185
|
+
"enabled": true,
|
|
186
|
+
"tools": ["JavaScript (ESLint)", "TypeScript (TypeScript ESLint)"]
|
|
187
|
+
},
|
|
188
|
+
"mirroring": {
|
|
189
|
+
"enabled": true,
|
|
190
|
+
"platforms": {
|
|
191
|
+
"github": { "enabled": true },
|
|
192
|
+
"gitlab": { "enabled": true }
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"plugins": {
|
|
196
|
+
"enabled": true,
|
|
197
|
+
"paths": ["./plugins"]
|
|
198
|
+
},
|
|
199
|
+
"cache": {
|
|
200
|
+
"enabled": true,
|
|
201
|
+
"strategy": "LRU",
|
|
202
|
+
"maxSize": 200
|
|
203
|
+
},
|
|
204
|
+
"performance": {
|
|
205
|
+
"enabled": true,
|
|
206
|
+
"collectMetrics": true
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Variables d'environnement
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
# Tokens
|
|
215
|
+
GITHUB_TOKEN=xxx
|
|
216
|
+
GITLAB_TOKEN=xxx
|
|
217
|
+
BITBUCKET_TOKEN=xxx
|
|
218
|
+
|
|
219
|
+
# Mirroring
|
|
220
|
+
push-guardian_MIRROR_SOURCE_PLATFORM=github
|
|
221
|
+
push-guardian_MIRROR_TARGET_PLATFORM=gitlab
|
|
222
|
+
|
|
223
|
+
# Review Apps
|
|
224
|
+
VERCEL_TOKEN=xxx
|
|
225
|
+
NETLIFY_AUTH_TOKEN=xxx
|
|
226
|
+
|
|
227
|
+
# Performance
|
|
228
|
+
push-guardian_ENABLE_METRICS=true
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Extensibilité
|
|
232
|
+
|
|
233
|
+
### Créer un plugin
|
|
234
|
+
|
|
235
|
+
```javascript
|
|
236
|
+
const BasePlugin = require('./src/core/plugins/basePlugin');
|
|
237
|
+
|
|
238
|
+
class MyPlugin extends BasePlugin {
|
|
239
|
+
constructor() {
|
|
240
|
+
super('my-plugin', '1.0.0');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async initialize() {
|
|
244
|
+
this.registerHook('pre-validate', async (data) => {
|
|
245
|
+
console.log('Pre-validation personnalisée');
|
|
246
|
+
return data;
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
module.exports = MyPlugin;
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Enregistrer le plugin
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
npx push-guardian plugin --load ./plugins
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Tests
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
# Tous les tests
|
|
264
|
+
npm test
|
|
265
|
+
|
|
266
|
+
# Tests avec couverture
|
|
267
|
+
npm test -- --coverage
|
|
268
|
+
|
|
269
|
+
# Tests d'un module spécifique
|
|
270
|
+
npm test -- tests/unit/configAnalyzer.test.js
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## Performance
|
|
274
|
+
|
|
275
|
+
Le système de performance collecte automatiquement:
|
|
276
|
+
- Durée des validations
|
|
277
|
+
- Durée des hooks
|
|
278
|
+
- Durée du linting
|
|
279
|
+
- Taux de succès
|
|
280
|
+
|
|
281
|
+
Analyse:
|
|
282
|
+
```bash
|
|
283
|
+
npx push-guardian performance --analyze
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Sécurité
|
|
287
|
+
|
|
288
|
+
- Tokens stockés dans `.env` (non versionné)
|
|
289
|
+
- Validation des entrées utilisateur
|
|
290
|
+
- Sandboxing des plugins
|
|
291
|
+
- Permissions limitées pour les hooks
|
|
292
|
+
|
|
293
|
+
## Limites connues
|
|
294
|
+
|
|
295
|
+
- Cache disque limité à 1 Go par défaut
|
|
296
|
+
- Review Apps limitées à 10 déploiements simultanés
|
|
297
|
+
- Plugins ne peuvent pas modifier le core
|
|
298
|
+
- Métriques conservées 30 jours maximum
|