feat: restructuration des profils équipe et amélioration du script extract-technologies

- Création de 12 fichiers de profils individuels dans docs/data/team/
- Chaque profil contient métadonnées YAML complètes (compétences, projets, soft skills)
- Correction du script extract-technologies.js pour charger toutes les compétences depuis les fichiers
- Mise à jour des blips radar avec les données d'équipe correctes
- Suppression des anciens fichiers dans radar/ (remplacés par radar-business/)
- 58 compétences au total chargées depuis les fichiers individuels
This commit is contained in:
syoul
2025-12-06 21:37:18 +01:00
parent 475d6958dc
commit 328c0dc2f5
85 changed files with 726 additions and 103 deletions

View File

@@ -8,21 +8,85 @@
const fs = require('fs');
const path = require('path');
// Mapping des compétences de l'équipe
const teamSkills = {
'poka': ['Flutter', 'Dart', 'ProxMox', 'bash', 'Python', 'infrastructure'],
'ManUtopiK': ['VueJS', 'Nuxt.js', 'JavaScript', 'TypeScript', 'CMS', 'web'],
'aya': ['Linux', 'glusterfs', 'cephfs', 'ipfs', 'infrastructure', 'systèmes distribués', 'ThreeFold'],
'Eloïs': ['Rust', 'blockchain', 'Substrate', 'migration'],
'Fred': ['IPFS', 'Secure ScuttleButt', 'Nostr', 'TiddlyWiki', 'développement', 'ThreeFold'],
'Vivien': ['Cesium', 'Godot'],
'1000i100': ['Serverless', 'GitLab', 'CI/CD', 'Docker', 'web'],
'tuxmain': ['cryptographie', 'chiffrage', 'math', 'électronique'],
'boris': ['UX', 'UI', 'Figma', 'LLM', 'JavaScript', 'TypeScript', 'APIs', 'Vis.js'],
'Syoul': ['bidouille', 'résilience', 'domotique', 'infrastructure décentralisée'],
'Hugo': ['financement', 'rédaction', 'gestion'],
'Yvv': ['gestion', 'médiathèque', 'wiki']
};
// Charger les compétences de l'équipe depuis les fichiers individuels
function loadTeamSkills() {
const teamDir = path.join(__dirname, '../docs/data/team');
const teamSkills = {};
if (!fs.existsSync(teamDir)) {
console.warn(`⚠️ Dossier ${teamDir} introuvable, utilisation du mapping par défaut`);
return {
'poka': ['Flutter', 'Dart', 'ProxMox', 'bash', 'Python', 'infrastructure'],
'ManUtopiK': ['VueJS', 'Nuxt.js', 'JavaScript', 'TypeScript', 'CMS', 'web'],
'aya': ['Linux', 'glusterfs', 'cephfs', 'ipfs', 'infrastructure', 'systèmes distribués', 'ThreeFold'],
'Eloïs': ['Rust', 'blockchain', 'Substrate', 'migration'],
'Fred': ['IPFS', 'Secure ScuttleButt', 'Nostr', 'TiddlyWiki', 'développement', 'ThreeFold'],
'Vivien': ['Cesium', 'Godot'],
'1000i100': ['Serverless', 'GitLab', 'CI/CD', 'Docker', 'web'],
'tuxmain': ['cryptographie', 'chiffrage', 'math', 'électronique'],
'boris': ['UX', 'UI', 'Figma', 'LLM', 'JavaScript', 'TypeScript', 'APIs', 'Vis.js'],
'Syoul': ['bidouille', 'résilience', 'domotique', 'infrastructure décentralisée'],
'Hugo': ['financement', 'rédaction', 'gestion'],
'Yvv': ['gestion', 'médiathèque', 'wiki']
};
}
const files = fs.readdirSync(teamDir).filter(f => f.endsWith('.md'));
for (const file of files) {
const filePath = path.join(teamDir, file);
const content = fs.readFileSync(filePath, 'utf-8');
// Extraire le front matter YAML
const yamlMatch = content.match(/^---\n([\s\S]*?)\n---/);
if (!yamlMatch) continue;
const yamlContent = yamlMatch[1];
const nameMatch = yamlContent.match(/^name:\s*["']?([^"'\n]+)["']?/m);
if (!nameMatch) continue;
const memberName = nameMatch[1];
const skills = [];
// Extraire les compétences depuis la section skills
// Trouver la section skills et extraire toutes les lignes " - name:"
const lines = yamlContent.split('\n');
let inSkillsSection = false;
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
// Détecter le début de la section skills
if (line.match(/^skills:\s*$/)) {
inSkillsSection = true;
continue;
}
// Si on est dans la section skills et qu'on trouve une nouvelle section (ligne qui commence par un mot-clé sans indentation)
if (inSkillsSection && line.match(/^\w+:/) && !line.match(/^\s+/)) {
inSkillsSection = false;
continue;
}
// Extraire les noms de compétences dans la section skills
if (inSkillsSection) {
const nameMatch = line.match(/^\s+-\s+name:\s*["']?([^"'\n]+)["']?/);
if (nameMatch) {
skills.push(nameMatch[1]);
}
}
}
if (skills.length > 0) {
teamSkills[memberName] = skills;
}
}
return teamSkills;
}
// Mapping des compétences de l'équipe (chargé dynamiquement)
const teamSkills = loadTeamSkills();
// Mapping technologies -> compétences de l'équipe
function findTeamCoverage(techName, techKeywords) {