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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user