Add skill removal functionality and enhance UI components

- Integrated onRemoveSkill functionality in SkillEvaluation, SkillSelector, and SkillEvaluationCard components for better skill management.
- Updated UI to improve user experience when removing skills, including tooltip descriptions and styling adjustments.
- Added new skills to backend, devops, frontend, and mobile JSON files for comprehensive skill coverage.
This commit is contained in:
Julien Froidefond
2025-08-20 16:06:09 +02:00
parent fe63f9592a
commit 5c510ebd07
22 changed files with 1758 additions and 42 deletions

View File

@@ -1,4 +1,4 @@
import { ExternalLink, BookOpen, Target, Info } from "lucide-react"; import { ExternalLink, Info, X } from "lucide-react";
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
@@ -11,6 +11,7 @@ interface SkillEvaluationCardProps {
skill: Skill; skill: Skill;
currentLevel: SkillLevel; currentLevel: SkillLevel;
onUpdateSkill: (skillId: string, level: SkillLevel) => void; onUpdateSkill: (skillId: string, level: SkillLevel) => void;
onRemoveSkill: (skillId: string) => void;
} }
function getLevelColor(level: Exclude<SkillLevel, null>) { function getLevelColor(level: Exclude<SkillLevel, null>) {
@@ -43,6 +44,7 @@ export function SkillEvaluationCard({
skill, skill,
currentLevel, currentLevel,
onUpdateSkill, onUpdateSkill,
onRemoveSkill,
}: SkillEvaluationCardProps) { }: SkillEvaluationCardProps) {
const TechIcon = getTechIcon(skill.id); const TechIcon = getTechIcon(skill.id);
@@ -131,27 +133,19 @@ export function SkillEvaluationCard({
); );
})} })}
{/* Goal buttons */} {/* Remove button */}
<div className="flex items-center gap-1 ml-2 border-l border-white/10 pl-2"> <div className="flex items-center ml-2 border-l border-white/10 pl-2">
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button className="p-1 rounded-lg hover:bg-white/10 transition-colors"> <button
<BookOpen className="h-3 w-3 text-slate-400 hover:text-blue-400" /> onClick={() => onRemoveSkill(skill.id)}
className="p-1 rounded-lg hover:bg-red-500/20 transition-colors"
>
<X className="h-3 w-3 text-slate-400 hover:text-red-400" />
</button> </button>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent> <TooltipContent>
<p className="text-xs">Envie d'apprendre</p> <p className="text-xs">Supprimer cette technologie</p>
</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger asChild>
<button className="p-1 rounded-lg hover:bg-white/10 transition-colors">
<Target className="h-3 w-3 text-slate-400 hover:text-green-400" />
</button>
</TooltipTrigger>
<TooltipContent>
<p className="text-xs">Peut encadrer</p>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</div> </div>

View File

@@ -5,12 +5,14 @@ interface SkillEvaluationGridProps {
currentCategory: SkillCategory; currentCategory: SkillCategory;
currentEvaluation: CategoryEvaluation; currentEvaluation: CategoryEvaluation;
onUpdateSkill: (category: string, skillId: string, level: SkillLevel) => void; onUpdateSkill: (category: string, skillId: string, level: SkillLevel) => void;
onRemoveSkill: (category: string, skillId: string) => void;
} }
export function SkillEvaluationGrid({ export function SkillEvaluationGrid({
currentCategory, currentCategory,
currentEvaluation, currentEvaluation,
onUpdateSkill, onUpdateSkill,
onRemoveSkill,
}: SkillEvaluationGridProps) { }: SkillEvaluationGridProps) {
const getSkillLevel = (skillId: string): SkillLevel => { const getSkillLevel = (skillId: string): SkillLevel => {
const skillEval = currentEvaluation?.skills.find( const skillEval = currentEvaluation?.skills.find(
@@ -52,6 +54,9 @@ export function SkillEvaluationGrid({
onUpdateSkill={(skillId, level) => onUpdateSkill={(skillId, level) =>
onUpdateSkill(currentCategory.category, skillId, level) onUpdateSkill(currentCategory.category, skillId, level)
} }
onRemoveSkill={(skillId) =>
onRemoveSkill(currentCategory.category, skillId)
}
/> />
); );
})} })}

View File

@@ -94,6 +94,7 @@ export function SkillEvaluation({
currentCategory={currentCategory} currentCategory={currentCategory}
currentEvaluation={currentEvaluation} currentEvaluation={currentEvaluation}
onUpdateSkill={onUpdateSkill} onUpdateSkill={onUpdateSkill}
onRemoveSkill={onRemoveSkill}
/> />
)} )}
</div> </div>

View File

@@ -11,8 +11,7 @@ import {
DialogTrigger, DialogTrigger,
} from "@/components/ui/dialog"; } from "@/components/ui/dialog";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { Badge } from "@/components/ui/badge"; import { Plus, Search } from "lucide-react";
import { Plus, Search, X } from "lucide-react";
import { SkillCategory, CategoryEvaluation } from "@/lib/types"; import { SkillCategory, CategoryEvaluation } from "@/lib/types";
import { getTechIcon } from "./icons/tech-icons"; import { getTechIcon } from "./icons/tech-icons";
@@ -41,9 +40,9 @@ export function SkillSelector({
(evaluation) => evaluation.category === selectedCategory (evaluation) => evaluation.category === selectedCategory
); );
if (!currentCategory || !currentEvaluation) return null; if (!currentCategory) return null;
const selectedSkillIds = currentEvaluation.selectedSkillIds || []; const selectedSkillIds = currentEvaluation?.selectedSkillIds || [];
const filteredSkills = currentCategory.skills.filter( const filteredSkills = currentCategory.skills.filter(
(skill) => (skill) =>
@@ -67,7 +66,10 @@ export function SkillSelector({
<h4 className="text-lg font-medium">Mes compétences sélectionnées</h4> <h4 className="text-lg font-medium">Mes compétences sélectionnées</h4>
<Dialog open={isOpen} onOpenChange={setIsOpen}> <Dialog open={isOpen} onOpenChange={setIsOpen}>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button size="sm" className="gap-2"> <Button
size="sm"
className="gap-2 bg-blue-500 hover:bg-blue-600 text-white shadow-lg"
>
<Plus className="h-4 w-4" /> <Plus className="h-4 w-4" />
Ajouter une compétence Ajouter une compétence
</Button> </Button>
@@ -147,24 +149,17 @@ export function SkillSelector({
</div> </div>
{selectedSkills.length > 0 ? ( {selectedSkills.length > 0 ? (
<div className="flex flex-wrap gap-2"> <div className="bg-muted/30 rounded-lg p-4">
{selectedSkills.map((skill) => ( <div className="flex items-center justify-between">
<Badge <p className="text-sm text-muted-foreground">
key={skill.id} {selectedSkills.length} compétence
variant="secondary" {selectedSkills.length > 1 ? "s" : ""} sélectionnée
className="gap-2 pr-1 cursor-pointer hover:bg-destructive/10 transition-colors" {selectedSkills.length > 1 ? "s" : ""}
> </p>
{skill.name} <div className="text-xs text-muted-foreground">
<Button Supprimez directement depuis les lignes ci-dessous
variant="ghost" </div>
size="sm" </div>
className="h-auto p-0.5 hover:bg-destructive hover:text-destructive-foreground"
onClick={() => onRemoveSkill(selectedCategory, skill.id)}
>
<X className="h-3 w-3" />
</Button>
</Badge>
))}
</div> </div>
) : ( ) : (
<div className="text-center py-8 text-muted-foreground border-2 border-dashed border-muted rounded-lg"> <div className="text-center py-8 text-muted-foreground border-2 border-dashed border-muted rounded-lg">

View File

@@ -61,6 +61,132 @@
"https://redis.io/documentation", "https://redis.io/documentation",
"https://github.com/redis/redis" "https://github.com/redis/redis"
] ]
},
{
"id": "golang",
"name": "Go",
"description": "Langage de programmation développé par Google",
"links": [
"https://golang.org/",
"https://golang.org/doc/"
]
},
{
"id": "rust",
"name": "Rust",
"description": "Langage de programmation système sûr et performant",
"links": [
"https://www.rust-lang.org/",
"https://doc.rust-lang.org/"
]
},
{
"id": "java-spring",
"name": "Java Spring",
"description": "Framework Java pour applications d'entreprise",
"links": [
"https://spring.io/",
"https://docs.spring.io/"
]
},
{
"id": "csharp-dotnet",
"name": "C# .NET",
"description": "Plateforme de développement Microsoft",
"links": [
"https://dotnet.microsoft.com/",
"https://docs.microsoft.com/dotnet/"
]
},
{
"id": "php-laravel",
"name": "PHP Laravel",
"description": "Framework PHP moderne pour applications web",
"links": [
"https://laravel.com/",
"https://laravel.com/docs"
]
},
{
"id": "ruby-rails",
"name": "Ruby on Rails",
"description": "Framework web en Ruby",
"links": [
"https://rubyonrails.org/",
"https://guides.rubyonrails.org/"
]
},
{
"id": "graphql",
"name": "GraphQL",
"description": "Langage de requête pour APIs",
"links": [
"https://graphql.org/",
"https://graphql.org/learn/"
]
},
{
"id": "prisma",
"name": "Prisma",
"description": "ORM moderne pour Node.js et TypeScript",
"links": [
"https://www.prisma.io/",
"https://www.prisma.io/docs"
]
},
{
"id": "trpc",
"name": "tRPC",
"description": "Framework TypeScript pour APIs type-safe",
"links": [
"https://trpc.io/",
"https://trpc.io/docs"
]
},
{
"id": "nest-js",
"name": "NestJS",
"description": "Framework Node.js pour applications scalables",
"links": [
"https://nestjs.com/",
"https://docs.nestjs.com/"
]
},
{
"id": "fastify",
"name": "Fastify",
"description": "Framework web rapide pour Node.js",
"links": [
"https://www.fastify.io/",
"https://www.fastify.io/docs/"
]
},
{
"id": "rabbitmq",
"name": "RabbitMQ",
"description": "Broker de messages open source",
"links": [
"https://www.rabbitmq.com/",
"https://www.rabbitmq.com/documentation.html"
]
},
{
"id": "apache-kafka",
"name": "Apache Kafka",
"description": "Plateforme de streaming distribuée",
"links": [
"https://kafka.apache.org/",
"https://kafka.apache.org/documentation/"
]
},
{
"id": "microservices",
"name": "Microservices",
"description": "Architecture en microservices",
"links": [
"https://microservices.io/",
"https://martinfowler.com/articles/microservices.html"
]
} }
] ]
} }

96
data/skills/cloud.json Normal file
View File

@@ -0,0 +1,96 @@
{
"category": "Cloud",
"icon": "cloud",
"skills": [
{
"id": "aws",
"name": "Amazon Web Services",
"description": "Plateforme de services cloud d'Amazon",
"links": [
"https://aws.amazon.com/",
"https://docs.aws.amazon.com/"
]
},
{
"id": "azure",
"name": "Microsoft Azure",
"description": "Plateforme cloud de Microsoft",
"links": [
"https://azure.microsoft.com/",
"https://docs.microsoft.com/azure/"
]
},
{
"id": "gcp",
"name": "Google Cloud Platform",
"description": "Services cloud de Google",
"links": [
"https://cloud.google.com/",
"https://cloud.google.com/docs"
]
},
{
"id": "terraform",
"name": "Terraform",
"description": "Outil d'infrastructure as code",
"links": [
"https://www.terraform.io/",
"https://learn.hashicorp.com/terraform"
]
},
{
"id": "serverless",
"name": "Serverless Framework",
"description": "Framework pour applications serverless",
"links": [
"https://www.serverless.com/",
"https://www.serverless.com/framework/docs/"
]
},
{
"id": "lambda",
"name": "AWS Lambda",
"description": "Service de calcul serverless d'AWS",
"links": [
"https://aws.amazon.com/lambda/",
"https://docs.aws.amazon.com/lambda/"
]
},
{
"id": "cloudformation",
"name": "CloudFormation",
"description": "Service d'infrastructure as code d'AWS",
"links": [
"https://aws.amazon.com/cloudformation/",
"https://docs.aws.amazon.com/cloudformation/"
]
},
{
"id": "s3",
"name": "Amazon S3",
"description": "Service de stockage d'objets d'AWS",
"links": [
"https://aws.amazon.com/s3/",
"https://docs.aws.amazon.com/s3/"
]
},
{
"id": "ec2",
"name": "Amazon EC2",
"description": "Service de calcul élastique d'AWS",
"links": [
"https://aws.amazon.com/ec2/",
"https://docs.aws.amazon.com/ec2/"
]
},
{
"id": "cloudfront",
"name": "CloudFront",
"description": "Réseau de diffusion de contenu (CDN) d'AWS",
"links": [
"https://aws.amazon.com/cloudfront/",
"https://docs.aws.amazon.com/cloudfront/"
]
}
]
}

96
data/skills/data.json Normal file
View File

@@ -0,0 +1,96 @@
{
"category": "Data",
"icon": "database",
"skills": [
{
"id": "sql",
"name": "SQL",
"description": "Langage de requête pour bases de données relationnelles",
"links": [
"https://www.postgresql.org/docs/",
"https://dev.mysql.com/doc/"
]
},
{
"id": "postgresql",
"name": "PostgreSQL",
"description": "Base de données relationnelle open source avancée",
"links": [
"https://www.postgresql.org/",
"https://www.postgresql.org/docs/"
]
},
{
"id": "mongodb",
"name": "MongoDB",
"description": "Base de données NoSQL orientée documents",
"links": [
"https://www.mongodb.com/",
"https://docs.mongodb.com/"
]
},
{
"id": "redis",
"name": "Redis",
"description": "Base de données en mémoire, cache et courtier de messages",
"links": [
"https://redis.io/",
"https://redis.io/docs/"
]
},
{
"id": "elasticsearch",
"name": "Elasticsearch",
"description": "Moteur de recherche et d'analyse distribué",
"links": [
"https://www.elastic.co/elasticsearch/",
"https://www.elastic.co/guide/"
]
},
{
"id": "python-data",
"name": "Python (Data Science)",
"description": "Python pour l'analyse de données et machine learning",
"links": [
"https://pandas.pydata.org/",
"https://scikit-learn.org/"
]
},
{
"id": "tableau",
"name": "Tableau",
"description": "Plateforme de visualisation de données",
"links": [
"https://www.tableau.com/",
"https://help.tableau.com/"
]
},
{
"id": "powerbi",
"name": "Power BI",
"description": "Service d'analyse de données de Microsoft",
"links": [
"https://powerbi.microsoft.com/",
"https://docs.microsoft.com/power-bi/"
]
},
{
"id": "spark",
"name": "Apache Spark",
"description": "Moteur de traitement de données distribuées",
"links": [
"https://spark.apache.org/",
"https://spark.apache.org/docs/"
]
},
{
"id": "airflow",
"name": "Apache Airflow",
"description": "Plateforme d'orchestration de workflows",
"links": [
"https://airflow.apache.org/",
"https://airflow.apache.org/docs/"
]
}
]
}

96
data/skills/design.json Normal file
View File

@@ -0,0 +1,96 @@
{
"category": "Design",
"icon": "palette",
"skills": [
{
"id": "figma",
"name": "Figma",
"description": "Outil de design d'interface collaboratif",
"links": [
"https://www.figma.com/",
"https://help.figma.com/"
]
},
{
"id": "sketch",
"name": "Sketch",
"description": "Outil de design d'interface pour macOS",
"links": [
"https://www.sketch.com/",
"https://www.sketch.com/docs/"
]
},
{
"id": "adobe-xd",
"name": "Adobe XD",
"description": "Outil de design et prototypage d'Adobe",
"links": [
"https://www.adobe.com/products/xd.html",
"https://helpx.adobe.com/xd/"
]
},
{
"id": "ux-ui",
"name": "UX/UI Design",
"description": "Conception d'expérience et d'interface utilisateur",
"links": [
"https://www.nngroup.com/",
"https://material.io/design/"
]
},
{
"id": "design-system",
"name": "Design System",
"description": "Systèmes de design et composants réutilisables",
"links": [
"https://designsystemsrepo.com/",
"https://www.designbetter.co/design-systems-handbook"
]
},
{
"id": "prototyping",
"name": "Prototypage",
"description": "Création de prototypes interactifs",
"links": [
"https://www.prototypr.io/",
"https://www.invisionapp.com/"
]
},
{
"id": "user-research",
"name": "Recherche utilisateur",
"description": "Méthodologies de recherche UX",
"links": [
"https://www.nngroup.com/articles/",
"https://www.usability.gov/"
]
},
{
"id": "accessibility",
"name": "Accessibilité",
"description": "Design accessible et inclusive",
"links": [
"https://www.w3.org/WAI/",
"https://webaim.org/"
]
},
{
"id": "responsive-design",
"name": "Design Responsive",
"description": "Conception adaptative multi-dispositifs",
"links": [
"https://developers.google.com/web/fundamentals/design-and-ux/responsive",
"https://responsivedesign.is/"
]
},
{
"id": "motion-design",
"name": "Motion Design",
"description": "Animation et transitions d'interface",
"links": [
"https://material.io/design/motion/",
"https://www.framer.com/"
]
}
]
}

View File

@@ -61,6 +61,132 @@
"https://docs.github.com/en/actions", "https://docs.github.com/en/actions",
"https://github.com/actions" "https://github.com/actions"
] ]
},
{
"id": "ansible",
"name": "Ansible",
"description": "Outil d'automatisation IT et de gestion de configuration",
"links": [
"https://www.ansible.com/",
"https://docs.ansible.com/"
]
},
{
"id": "jenkins",
"name": "Jenkins",
"description": "Serveur d'automatisation open source",
"links": [
"https://www.jenkins.io/",
"https://www.jenkins.io/doc/"
]
},
{
"id": "gitlab-ci",
"name": "GitLab CI/CD",
"description": "Pipeline d'intégration continue de GitLab",
"links": [
"https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/",
"https://docs.gitlab.com/ee/ci/"
]
},
{
"id": "prometheus",
"name": "Prometheus",
"description": "Système de monitoring et d'alerting",
"links": [
"https://prometheus.io/",
"https://prometheus.io/docs/"
]
},
{
"id": "grafana",
"name": "Grafana",
"description": "Plateforme de visualisation et monitoring",
"links": [
"https://grafana.com/",
"https://grafana.com/docs/"
]
},
{
"id": "elk-stack",
"name": "ELK Stack",
"description": "Elasticsearch, Logstash, et Kibana pour logs",
"links": [
"https://www.elastic.co/what-is/elk-stack",
"https://www.elastic.co/guide/"
]
},
{
"id": "nginx",
"name": "Nginx",
"description": "Serveur web et proxy inverse",
"links": [
"https://nginx.org/",
"https://nginx.org/en/docs/"
]
},
{
"id": "apache",
"name": "Apache HTTP Server",
"description": "Serveur web open source",
"links": [
"https://httpd.apache.org/",
"https://httpd.apache.org/docs/"
]
},
{
"id": "traefik",
"name": "Traefik",
"description": "Proxy inverse moderne et load balancer",
"links": [
"https://traefik.io/",
"https://doc.traefik.io/"
]
},
{
"id": "helm",
"name": "Helm",
"description": "Gestionnaire de packages pour Kubernetes",
"links": [
"https://helm.sh/",
"https://helm.sh/docs/"
]
},
{
"id": "istio",
"name": "Istio",
"description": "Service mesh pour microservices",
"links": [
"https://istio.io/",
"https://istio.io/latest/docs/"
]
},
{
"id": "vault",
"name": "HashiCorp Vault",
"description": "Gestion des secrets et chiffrement",
"links": [
"https://www.vaultproject.io/",
"https://learn.hashicorp.com/vault"
]
},
{
"id": "consul",
"name": "HashiCorp Consul",
"description": "Service discovery et configuration",
"links": [
"https://www.consul.io/",
"https://learn.hashicorp.com/consul"
]
},
{
"id": "nomad",
"name": "HashiCorp Nomad",
"description": "Orchestrateur de workloads",
"links": [
"https://www.nomadproject.io/",
"https://learn.hashicorp.com/nomad"
]
} }
] ]
} }

View File

@@ -61,6 +61,123 @@
"https://webpack.js.org/concepts/", "https://webpack.js.org/concepts/",
"https://github.com/webpack/webpack" "https://github.com/webpack/webpack"
] ]
},
{
"id": "vite",
"name": "Vite",
"description": "Outil de build rapide pour applications modernes",
"links": [
"https://vitejs.dev/",
"https://vitejs.dev/guide/"
]
},
{
"id": "svelte",
"name": "Svelte",
"description": "Framework de compilation pour interfaces utilisateur",
"links": [
"https://svelte.dev/",
"https://svelte.dev/docs"
]
},
{
"id": "solidjs",
"name": "SolidJS",
"description": "Framework JavaScript réactif et performant",
"links": [
"https://www.solidjs.com/",
"https://www.solidjs.com/docs"
]
},
{
"id": "astro",
"name": "Astro",
"description": "Framework statique multi-framework",
"links": [
"https://astro.build/",
"https://docs.astro.build/"
]
},
{
"id": "remix",
"name": "Remix",
"description": "Framework full-stack centré sur les standards web",
"links": [
"https://remix.run/",
"https://remix.run/docs"
]
},
{
"id": "storybook",
"name": "Storybook",
"description": "Outil de développement pour composants UI",
"links": [
"https://storybook.js.org/",
"https://storybook.js.org/docs"
]
},
{
"id": "cypress",
"name": "Cypress",
"description": "Framework de tests end-to-end",
"links": [
"https://www.cypress.io/",
"https://docs.cypress.io/"
]
},
{
"id": "playwright",
"name": "Playwright",
"description": "Framework de tests pour applications web",
"links": [
"https://playwright.dev/",
"https://playwright.dev/docs/"
]
},
{
"id": "three-js",
"name": "Three.js",
"description": "Bibliothèque JavaScript pour 3D dans le navigateur",
"links": [
"https://threejs.org/",
"https://threejs.org/docs/"
]
},
{
"id": "d3",
"name": "D3.js",
"description": "Bibliothèque de visualisation de données",
"links": [
"https://d3js.org/",
"https://github.com/d3/d3/wiki"
]
},
{
"id": "gsap",
"name": "GSAP",
"description": "Bibliothèque d'animations web performantes",
"links": [
"https://greensock.com/gsap/",
"https://greensock.com/docs/"
]
},
{
"id": "web-components",
"name": "Web Components",
"description": "Standards natifs pour composants réutilisables",
"links": [
"https://developer.mozilla.org/en-US/docs/Web/Web_Components",
"https://web.dev/web-components/"
]
},
{
"id": "pwa",
"name": "Progressive Web Apps",
"description": "Applications web progressives",
"links": [
"https://web.dev/progressive-web-apps/",
"https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps"
]
} }
] ]
} }

View File

@@ -51,6 +51,105 @@
"https://docs.expo.dev/", "https://docs.expo.dev/",
"https://github.com/expo/expo" "https://github.com/expo/expo"
] ]
},
{
"id": "ionic",
"name": "Ionic",
"description": "Framework pour applications mobiles hybrides",
"links": [
"https://ionicframework.com/",
"https://ionicframework.com/docs"
]
},
{
"id": "xamarin",
"name": "Xamarin",
"description": "Plateforme de développement mobile Microsoft",
"links": [
"https://dotnet.microsoft.com/apps/xamarin",
"https://docs.microsoft.com/xamarin/"
]
},
{
"id": "unity",
"name": "Unity",
"description": "Moteur de jeu pour applications mobiles",
"links": [
"https://unity.com/",
"https://docs.unity3d.com/"
]
},
{
"id": "cordova",
"name": "Apache Cordova",
"description": "Plateforme pour applications mobiles hybrides",
"links": [
"https://cordova.apache.org/",
"https://cordova.apache.org/docs/"
]
},
{
"id": "capacitor",
"name": "Capacitor",
"description": "Runtime natif pour applications web",
"links": [
"https://capacitorjs.com/",
"https://capacitorjs.com/docs"
]
},
{
"id": "fastlane",
"name": "Fastlane",
"description": "Automatisation pour développement mobile",
"links": [
"https://fastlane.tools/",
"https://docs.fastlane.tools/"
]
},
{
"id": "firebase",
"name": "Firebase",
"description": "Plateforme de développement mobile Google",
"links": [
"https://firebase.google.com/",
"https://firebase.google.com/docs"
]
},
{
"id": "app-store-optimization",
"name": "App Store Optimization",
"description": "Optimisation pour stores d'applications",
"links": [
"https://developer.apple.com/app-store/",
"https://play.google.com/console/"
]
},
{
"id": "mobile-testing",
"name": "Tests Mobile",
"description": "Frameworks de tests pour applications mobiles",
"links": [
"https://appium.io/",
"https://detox.js.org/"
]
},
{
"id": "mobile-performance",
"name": "Performance Mobile",
"description": "Optimisation des performances mobiles",
"links": [
"https://developers.google.com/web/tools/lighthouse",
"https://developer.android.com/topic/performance"
]
},
{
"id": "push-notifications",
"name": "Push Notifications",
"description": "Notifications push pour applications mobiles",
"links": [
"https://firebase.google.com/docs/cloud-messaging",
"https://developer.apple.com/notifications/"
]
} }
] ]
} }

96
data/skills/security.json Normal file
View File

@@ -0,0 +1,96 @@
{
"category": "Security",
"icon": "shield",
"skills": [
{
"id": "oauth",
"name": "OAuth 2.0",
"description": "Framework d'autorisation pour APIs",
"links": [
"https://oauth.net/2/",
"https://tools.ietf.org/html/rfc6749"
]
},
{
"id": "jwt",
"name": "JSON Web Tokens",
"description": "Standard pour transmettre des informations de façon sécurisée",
"links": [
"https://jwt.io/",
"https://tools.ietf.org/html/rfc7519"
]
},
{
"id": "https-ssl",
"name": "HTTPS/SSL",
"description": "Protocoles de sécurisation des communications web",
"links": [
"https://developer.mozilla.org/en-US/docs/Web/Security",
"https://letsencrypt.org/"
]
},
{
"id": "owasp",
"name": "OWASP",
"description": "Bonnes pratiques de sécurité des applications web",
"links": [
"https://owasp.org/",
"https://owasp.org/www-project-top-ten/"
]
},
{
"id": "csrf-xss",
"name": "CSRF/XSS Protection",
"description": "Protection contre les attaques CSRF et XSS",
"links": [
"https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html",
"https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"
]
},
{
"id": "penetration-testing",
"name": "Tests de pénétration",
"description": "Tests de sécurité offensifs",
"links": [
"https://owasp.org/www-community/Penetration_Testing_Methodologies",
"https://www.kali.org/"
]
},
{
"id": "cryptography",
"name": "Cryptographie",
"description": "Chiffrement et hachage des données",
"links": [
"https://cryptography.io/",
"https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API"
]
},
{
"id": "auth0",
"name": "Auth0",
"description": "Plateforme d'authentification et d'autorisation",
"links": [
"https://auth0.com/",
"https://auth0.com/docs"
]
},
{
"id": "keycloak",
"name": "Keycloak",
"description": "Solution open source de gestion d'identité",
"links": [
"https://www.keycloak.org/",
"https://www.keycloak.org/documentation"
]
},
{
"id": "vault",
"name": "HashiCorp Vault",
"description": "Outil de gestion des secrets",
"links": [
"https://www.vaultproject.io/",
"https://learn.hashicorp.com/vault"
]
}
]
}

View File

@@ -3,6 +3,10 @@ import {
Server, Server,
Settings, Settings,
Smartphone, Smartphone,
Database,
Cloud,
Shield,
Palette,
LucideIcon LucideIcon
} from "lucide-react"; } from "lucide-react";
@@ -11,6 +15,10 @@ const CATEGORY_ICON_MAP: Record<string, LucideIcon> = {
server: Server, server: Server,
settings: Settings, settings: Settings,
smartphone: Smartphone, smartphone: Smartphone,
database: Database,
cloud: Cloud,
shield: Shield,
palette: Palette,
}; };
export function getCategoryIcon(iconName: string): LucideIcon { export function getCategoryIcon(iconName: string): LucideIcon {

View File

@@ -1,7 +1,16 @@
import { SkillCategory, Team } from "./types"; import { SkillCategory, Team } from "./types";
export async function loadSkillCategories(): Promise<SkillCategory[]> { export async function loadSkillCategories(): Promise<SkillCategory[]> {
const categories = ["frontend", "backend", "devops", "mobile"]; const categories = [
"frontend",
"backend",
"devops",
"mobile",
"data",
"cloud",
"security",
"design",
];
const skillCategories: SkillCategory[] = []; const skillCategories: SkillCategory[] = [];
for (const category of categories) { for (const category of categories) {

View File

@@ -61,6 +61,132 @@
"https://redis.io/documentation", "https://redis.io/documentation",
"https://github.com/redis/redis" "https://github.com/redis/redis"
] ]
},
{
"id": "golang",
"name": "Go",
"description": "Langage de programmation développé par Google",
"links": [
"https://golang.org/",
"https://golang.org/doc/"
]
},
{
"id": "rust",
"name": "Rust",
"description": "Langage de programmation système sûr et performant",
"links": [
"https://www.rust-lang.org/",
"https://doc.rust-lang.org/"
]
},
{
"id": "java-spring",
"name": "Java Spring",
"description": "Framework Java pour applications d'entreprise",
"links": [
"https://spring.io/",
"https://docs.spring.io/"
]
},
{
"id": "csharp-dotnet",
"name": "C# .NET",
"description": "Plateforme de développement Microsoft",
"links": [
"https://dotnet.microsoft.com/",
"https://docs.microsoft.com/dotnet/"
]
},
{
"id": "php-laravel",
"name": "PHP Laravel",
"description": "Framework PHP moderne pour applications web",
"links": [
"https://laravel.com/",
"https://laravel.com/docs"
]
},
{
"id": "ruby-rails",
"name": "Ruby on Rails",
"description": "Framework web en Ruby",
"links": [
"https://rubyonrails.org/",
"https://guides.rubyonrails.org/"
]
},
{
"id": "graphql",
"name": "GraphQL",
"description": "Langage de requête pour APIs",
"links": [
"https://graphql.org/",
"https://graphql.org/learn/"
]
},
{
"id": "prisma",
"name": "Prisma",
"description": "ORM moderne pour Node.js et TypeScript",
"links": [
"https://www.prisma.io/",
"https://www.prisma.io/docs"
]
},
{
"id": "trpc",
"name": "tRPC",
"description": "Framework TypeScript pour APIs type-safe",
"links": [
"https://trpc.io/",
"https://trpc.io/docs"
]
},
{
"id": "nest-js",
"name": "NestJS",
"description": "Framework Node.js pour applications scalables",
"links": [
"https://nestjs.com/",
"https://docs.nestjs.com/"
]
},
{
"id": "fastify",
"name": "Fastify",
"description": "Framework web rapide pour Node.js",
"links": [
"https://www.fastify.io/",
"https://www.fastify.io/docs/"
]
},
{
"id": "rabbitmq",
"name": "RabbitMQ",
"description": "Broker de messages open source",
"links": [
"https://www.rabbitmq.com/",
"https://www.rabbitmq.com/documentation.html"
]
},
{
"id": "apache-kafka",
"name": "Apache Kafka",
"description": "Plateforme de streaming distribuée",
"links": [
"https://kafka.apache.org/",
"https://kafka.apache.org/documentation/"
]
},
{
"id": "microservices",
"name": "Microservices",
"description": "Architecture en microservices",
"links": [
"https://microservices.io/",
"https://martinfowler.com/articles/microservices.html"
]
} }
] ]
} }

View File

@@ -0,0 +1,96 @@
{
"category": "Cloud",
"icon": "cloud",
"skills": [
{
"id": "aws",
"name": "Amazon Web Services",
"description": "Plateforme de services cloud d'Amazon",
"links": [
"https://aws.amazon.com/",
"https://docs.aws.amazon.com/"
]
},
{
"id": "azure",
"name": "Microsoft Azure",
"description": "Plateforme cloud de Microsoft",
"links": [
"https://azure.microsoft.com/",
"https://docs.microsoft.com/azure/"
]
},
{
"id": "gcp",
"name": "Google Cloud Platform",
"description": "Services cloud de Google",
"links": [
"https://cloud.google.com/",
"https://cloud.google.com/docs"
]
},
{
"id": "terraform",
"name": "Terraform",
"description": "Outil d'infrastructure as code",
"links": [
"https://www.terraform.io/",
"https://learn.hashicorp.com/terraform"
]
},
{
"id": "serverless",
"name": "Serverless Framework",
"description": "Framework pour applications serverless",
"links": [
"https://www.serverless.com/",
"https://www.serverless.com/framework/docs/"
]
},
{
"id": "lambda",
"name": "AWS Lambda",
"description": "Service de calcul serverless d'AWS",
"links": [
"https://aws.amazon.com/lambda/",
"https://docs.aws.amazon.com/lambda/"
]
},
{
"id": "cloudformation",
"name": "CloudFormation",
"description": "Service d'infrastructure as code d'AWS",
"links": [
"https://aws.amazon.com/cloudformation/",
"https://docs.aws.amazon.com/cloudformation/"
]
},
{
"id": "s3",
"name": "Amazon S3",
"description": "Service de stockage d'objets d'AWS",
"links": [
"https://aws.amazon.com/s3/",
"https://docs.aws.amazon.com/s3/"
]
},
{
"id": "ec2",
"name": "Amazon EC2",
"description": "Service de calcul élastique d'AWS",
"links": [
"https://aws.amazon.com/ec2/",
"https://docs.aws.amazon.com/ec2/"
]
},
{
"id": "cloudfront",
"name": "CloudFront",
"description": "Réseau de diffusion de contenu (CDN) d'AWS",
"links": [
"https://aws.amazon.com/cloudfront/",
"https://docs.aws.amazon.com/cloudfront/"
]
}
]
}

View File

@@ -0,0 +1,96 @@
{
"category": "Data",
"icon": "database",
"skills": [
{
"id": "sql",
"name": "SQL",
"description": "Langage de requête pour bases de données relationnelles",
"links": [
"https://www.postgresql.org/docs/",
"https://dev.mysql.com/doc/"
]
},
{
"id": "postgresql",
"name": "PostgreSQL",
"description": "Base de données relationnelle open source avancée",
"links": [
"https://www.postgresql.org/",
"https://www.postgresql.org/docs/"
]
},
{
"id": "mongodb",
"name": "MongoDB",
"description": "Base de données NoSQL orientée documents",
"links": [
"https://www.mongodb.com/",
"https://docs.mongodb.com/"
]
},
{
"id": "redis",
"name": "Redis",
"description": "Base de données en mémoire, cache et courtier de messages",
"links": [
"https://redis.io/",
"https://redis.io/docs/"
]
},
{
"id": "elasticsearch",
"name": "Elasticsearch",
"description": "Moteur de recherche et d'analyse distribué",
"links": [
"https://www.elastic.co/elasticsearch/",
"https://www.elastic.co/guide/"
]
},
{
"id": "python-data",
"name": "Python (Data Science)",
"description": "Python pour l'analyse de données et machine learning",
"links": [
"https://pandas.pydata.org/",
"https://scikit-learn.org/"
]
},
{
"id": "tableau",
"name": "Tableau",
"description": "Plateforme de visualisation de données",
"links": [
"https://www.tableau.com/",
"https://help.tableau.com/"
]
},
{
"id": "powerbi",
"name": "Power BI",
"description": "Service d'analyse de données de Microsoft",
"links": [
"https://powerbi.microsoft.com/",
"https://docs.microsoft.com/power-bi/"
]
},
{
"id": "spark",
"name": "Apache Spark",
"description": "Moteur de traitement de données distribuées",
"links": [
"https://spark.apache.org/",
"https://spark.apache.org/docs/"
]
},
{
"id": "airflow",
"name": "Apache Airflow",
"description": "Plateforme d'orchestration de workflows",
"links": [
"https://airflow.apache.org/",
"https://airflow.apache.org/docs/"
]
}
]
}

View File

@@ -0,0 +1,96 @@
{
"category": "Design",
"icon": "palette",
"skills": [
{
"id": "figma",
"name": "Figma",
"description": "Outil de design d'interface collaboratif",
"links": [
"https://www.figma.com/",
"https://help.figma.com/"
]
},
{
"id": "sketch",
"name": "Sketch",
"description": "Outil de design d'interface pour macOS",
"links": [
"https://www.sketch.com/",
"https://www.sketch.com/docs/"
]
},
{
"id": "adobe-xd",
"name": "Adobe XD",
"description": "Outil de design et prototypage d'Adobe",
"links": [
"https://www.adobe.com/products/xd.html",
"https://helpx.adobe.com/xd/"
]
},
{
"id": "ux-ui",
"name": "UX/UI Design",
"description": "Conception d'expérience et d'interface utilisateur",
"links": [
"https://www.nngroup.com/",
"https://material.io/design/"
]
},
{
"id": "design-system",
"name": "Design System",
"description": "Systèmes de design et composants réutilisables",
"links": [
"https://designsystemsrepo.com/",
"https://www.designbetter.co/design-systems-handbook"
]
},
{
"id": "prototyping",
"name": "Prototypage",
"description": "Création de prototypes interactifs",
"links": [
"https://www.prototypr.io/",
"https://www.invisionapp.com/"
]
},
{
"id": "user-research",
"name": "Recherche utilisateur",
"description": "Méthodologies de recherche UX",
"links": [
"https://www.nngroup.com/articles/",
"https://www.usability.gov/"
]
},
{
"id": "accessibility",
"name": "Accessibilité",
"description": "Design accessible et inclusive",
"links": [
"https://www.w3.org/WAI/",
"https://webaim.org/"
]
},
{
"id": "responsive-design",
"name": "Design Responsive",
"description": "Conception adaptative multi-dispositifs",
"links": [
"https://developers.google.com/web/fundamentals/design-and-ux/responsive",
"https://responsivedesign.is/"
]
},
{
"id": "motion-design",
"name": "Motion Design",
"description": "Animation et transitions d'interface",
"links": [
"https://material.io/design/motion/",
"https://www.framer.com/"
]
}
]
}

View File

@@ -61,6 +61,132 @@
"https://docs.github.com/en/actions", "https://docs.github.com/en/actions",
"https://github.com/actions" "https://github.com/actions"
] ]
},
{
"id": "ansible",
"name": "Ansible",
"description": "Outil d'automatisation IT et de gestion de configuration",
"links": [
"https://www.ansible.com/",
"https://docs.ansible.com/"
]
},
{
"id": "jenkins",
"name": "Jenkins",
"description": "Serveur d'automatisation open source",
"links": [
"https://www.jenkins.io/",
"https://www.jenkins.io/doc/"
]
},
{
"id": "gitlab-ci",
"name": "GitLab CI/CD",
"description": "Pipeline d'intégration continue de GitLab",
"links": [
"https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/",
"https://docs.gitlab.com/ee/ci/"
]
},
{
"id": "prometheus",
"name": "Prometheus",
"description": "Système de monitoring et d'alerting",
"links": [
"https://prometheus.io/",
"https://prometheus.io/docs/"
]
},
{
"id": "grafana",
"name": "Grafana",
"description": "Plateforme de visualisation et monitoring",
"links": [
"https://grafana.com/",
"https://grafana.com/docs/"
]
},
{
"id": "elk-stack",
"name": "ELK Stack",
"description": "Elasticsearch, Logstash, et Kibana pour logs",
"links": [
"https://www.elastic.co/what-is/elk-stack",
"https://www.elastic.co/guide/"
]
},
{
"id": "nginx",
"name": "Nginx",
"description": "Serveur web et proxy inverse",
"links": [
"https://nginx.org/",
"https://nginx.org/en/docs/"
]
},
{
"id": "apache",
"name": "Apache HTTP Server",
"description": "Serveur web open source",
"links": [
"https://httpd.apache.org/",
"https://httpd.apache.org/docs/"
]
},
{
"id": "traefik",
"name": "Traefik",
"description": "Proxy inverse moderne et load balancer",
"links": [
"https://traefik.io/",
"https://doc.traefik.io/"
]
},
{
"id": "helm",
"name": "Helm",
"description": "Gestionnaire de packages pour Kubernetes",
"links": [
"https://helm.sh/",
"https://helm.sh/docs/"
]
},
{
"id": "istio",
"name": "Istio",
"description": "Service mesh pour microservices",
"links": [
"https://istio.io/",
"https://istio.io/latest/docs/"
]
},
{
"id": "vault",
"name": "HashiCorp Vault",
"description": "Gestion des secrets et chiffrement",
"links": [
"https://www.vaultproject.io/",
"https://learn.hashicorp.com/vault"
]
},
{
"id": "consul",
"name": "HashiCorp Consul",
"description": "Service discovery et configuration",
"links": [
"https://www.consul.io/",
"https://learn.hashicorp.com/consul"
]
},
{
"id": "nomad",
"name": "HashiCorp Nomad",
"description": "Orchestrateur de workloads",
"links": [
"https://www.nomadproject.io/",
"https://learn.hashicorp.com/nomad"
]
} }
] ]
} }

View File

@@ -61,6 +61,123 @@
"https://webpack.js.org/concepts/", "https://webpack.js.org/concepts/",
"https://github.com/webpack/webpack" "https://github.com/webpack/webpack"
] ]
},
{
"id": "vite",
"name": "Vite",
"description": "Outil de build rapide pour applications modernes",
"links": [
"https://vitejs.dev/",
"https://vitejs.dev/guide/"
]
},
{
"id": "svelte",
"name": "Svelte",
"description": "Framework de compilation pour interfaces utilisateur",
"links": [
"https://svelte.dev/",
"https://svelte.dev/docs"
]
},
{
"id": "solidjs",
"name": "SolidJS",
"description": "Framework JavaScript réactif et performant",
"links": [
"https://www.solidjs.com/",
"https://www.solidjs.com/docs"
]
},
{
"id": "astro",
"name": "Astro",
"description": "Framework statique multi-framework",
"links": [
"https://astro.build/",
"https://docs.astro.build/"
]
},
{
"id": "remix",
"name": "Remix",
"description": "Framework full-stack centré sur les standards web",
"links": [
"https://remix.run/",
"https://remix.run/docs"
]
},
{
"id": "storybook",
"name": "Storybook",
"description": "Outil de développement pour composants UI",
"links": [
"https://storybook.js.org/",
"https://storybook.js.org/docs"
]
},
{
"id": "cypress",
"name": "Cypress",
"description": "Framework de tests end-to-end",
"links": [
"https://www.cypress.io/",
"https://docs.cypress.io/"
]
},
{
"id": "playwright",
"name": "Playwright",
"description": "Framework de tests pour applications web",
"links": [
"https://playwright.dev/",
"https://playwright.dev/docs/"
]
},
{
"id": "three-js",
"name": "Three.js",
"description": "Bibliothèque JavaScript pour 3D dans le navigateur",
"links": [
"https://threejs.org/",
"https://threejs.org/docs/"
]
},
{
"id": "d3",
"name": "D3.js",
"description": "Bibliothèque de visualisation de données",
"links": [
"https://d3js.org/",
"https://github.com/d3/d3/wiki"
]
},
{
"id": "gsap",
"name": "GSAP",
"description": "Bibliothèque d'animations web performantes",
"links": [
"https://greensock.com/gsap/",
"https://greensock.com/docs/"
]
},
{
"id": "web-components",
"name": "Web Components",
"description": "Standards natifs pour composants réutilisables",
"links": [
"https://developer.mozilla.org/en-US/docs/Web/Web_Components",
"https://web.dev/web-components/"
]
},
{
"id": "pwa",
"name": "Progressive Web Apps",
"description": "Applications web progressives",
"links": [
"https://web.dev/progressive-web-apps/",
"https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps"
]
} }
] ]
} }

View File

@@ -51,6 +51,105 @@
"https://docs.expo.dev/", "https://docs.expo.dev/",
"https://github.com/expo/expo" "https://github.com/expo/expo"
] ]
},
{
"id": "ionic",
"name": "Ionic",
"description": "Framework pour applications mobiles hybrides",
"links": [
"https://ionicframework.com/",
"https://ionicframework.com/docs"
]
},
{
"id": "xamarin",
"name": "Xamarin",
"description": "Plateforme de développement mobile Microsoft",
"links": [
"https://dotnet.microsoft.com/apps/xamarin",
"https://docs.microsoft.com/xamarin/"
]
},
{
"id": "unity",
"name": "Unity",
"description": "Moteur de jeu pour applications mobiles",
"links": [
"https://unity.com/",
"https://docs.unity3d.com/"
]
},
{
"id": "cordova",
"name": "Apache Cordova",
"description": "Plateforme pour applications mobiles hybrides",
"links": [
"https://cordova.apache.org/",
"https://cordova.apache.org/docs/"
]
},
{
"id": "capacitor",
"name": "Capacitor",
"description": "Runtime natif pour applications web",
"links": [
"https://capacitorjs.com/",
"https://capacitorjs.com/docs"
]
},
{
"id": "fastlane",
"name": "Fastlane",
"description": "Automatisation pour développement mobile",
"links": [
"https://fastlane.tools/",
"https://docs.fastlane.tools/"
]
},
{
"id": "firebase",
"name": "Firebase",
"description": "Plateforme de développement mobile Google",
"links": [
"https://firebase.google.com/",
"https://firebase.google.com/docs"
]
},
{
"id": "app-store-optimization",
"name": "App Store Optimization",
"description": "Optimisation pour stores d'applications",
"links": [
"https://developer.apple.com/app-store/",
"https://play.google.com/console/"
]
},
{
"id": "mobile-testing",
"name": "Tests Mobile",
"description": "Frameworks de tests pour applications mobiles",
"links": [
"https://appium.io/",
"https://detox.js.org/"
]
},
{
"id": "mobile-performance",
"name": "Performance Mobile",
"description": "Optimisation des performances mobiles",
"links": [
"https://developers.google.com/web/tools/lighthouse",
"https://developer.android.com/topic/performance"
]
},
{
"id": "push-notifications",
"name": "Push Notifications",
"description": "Notifications push pour applications mobiles",
"links": [
"https://firebase.google.com/docs/cloud-messaging",
"https://developer.apple.com/notifications/"
]
} }
] ]
} }

View File

@@ -0,0 +1,96 @@
{
"category": "Security",
"icon": "shield",
"skills": [
{
"id": "oauth",
"name": "OAuth 2.0",
"description": "Framework d'autorisation pour APIs",
"links": [
"https://oauth.net/2/",
"https://tools.ietf.org/html/rfc6749"
]
},
{
"id": "jwt",
"name": "JSON Web Tokens",
"description": "Standard pour transmettre des informations de façon sécurisée",
"links": [
"https://jwt.io/",
"https://tools.ietf.org/html/rfc7519"
]
},
{
"id": "https-ssl",
"name": "HTTPS/SSL",
"description": "Protocoles de sécurisation des communications web",
"links": [
"https://developer.mozilla.org/en-US/docs/Web/Security",
"https://letsencrypt.org/"
]
},
{
"id": "owasp",
"name": "OWASP",
"description": "Bonnes pratiques de sécurité des applications web",
"links": [
"https://owasp.org/",
"https://owasp.org/www-project-top-ten/"
]
},
{
"id": "csrf-xss",
"name": "CSRF/XSS Protection",
"description": "Protection contre les attaques CSRF et XSS",
"links": [
"https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html",
"https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"
]
},
{
"id": "penetration-testing",
"name": "Tests de pénétration",
"description": "Tests de sécurité offensifs",
"links": [
"https://owasp.org/www-community/Penetration_Testing_Methodologies",
"https://www.kali.org/"
]
},
{
"id": "cryptography",
"name": "Cryptographie",
"description": "Chiffrement et hachage des données",
"links": [
"https://cryptography.io/",
"https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API"
]
},
{
"id": "auth0",
"name": "Auth0",
"description": "Plateforme d'authentification et d'autorisation",
"links": [
"https://auth0.com/",
"https://auth0.com/docs"
]
},
{
"id": "keycloak",
"name": "Keycloak",
"description": "Solution open source de gestion d'identité",
"links": [
"https://www.keycloak.org/",
"https://www.keycloak.org/documentation"
]
},
{
"id": "vault",
"name": "HashiCorp Vault",
"description": "Outil de gestion des secrets",
"links": [
"https://www.vaultproject.io/",
"https://learn.hashicorp.com/vault"
]
}
]
}