chore: datas are ok and sync also

This commit is contained in:
Julien Froidefond
2025-08-27 12:18:40 +02:00
parent aee5d74445
commit 88dc00a44b
11 changed files with 385 additions and 211 deletions

View File

@@ -11,7 +11,8 @@
"https://nodejs.org/",
"https://nodejs.org/en/docs/",
"https://github.com/nodejs/node"
]
],
"importance": "majeure"
},
{
"id": "python",
@@ -22,7 +23,8 @@
"https://www.python.org/",
"https://docs.python.org/3/",
"https://github.com/python/cpython"
]
],
"importance": "majeure"
},
{
"id": "express",
@@ -33,28 +35,32 @@
"https://expressjs.com/",
"https://expressjs.com/en/guide/routing.html",
"https://github.com/expressjs/express"
]
],
"importance": "standard"
},
{
"id": "golang",
"name": "Go",
"description": "Langage de programmation développé par Google",
"icon": "fab-golang",
"links": ["https://golang.org/", "https://golang.org/doc/"]
"links": ["https://golang.org/", "https://golang.org/doc/"],
"importance": "standard"
},
{
"id": "rust",
"name": "Rust",
"description": "Langage de programmation système sûr et performant",
"icon": "fab-rust",
"links": ["https://www.rust-lang.org/", "https://doc.rust-lang.org/"]
"links": ["https://www.rust-lang.org/", "https://doc.rust-lang.org/"],
"importance": "standard"
},
{
"id": "java-spring",
"name": "Java Spring",
"description": "Framework Java pour applications d'entreprise",
"icon": "fab-java",
"links": ["https://spring.io/", "https://docs.spring.io/"]
"links": ["https://spring.io/", "https://docs.spring.io/"],
"importance": "majeure"
},
{
"id": "csharp-dotnet",
@@ -64,56 +70,64 @@
"links": [
"https://dotnet.microsoft.com/",
"https://docs.microsoft.com/dotnet/"
]
],
"importance": "incontournable"
},
{
"id": "php-laravel",
"name": "PHP Laravel",
"description": "Framework PHP moderne pour applications web",
"icon": "fab-php",
"links": ["https://laravel.com/", "https://laravel.com/docs"]
"links": ["https://laravel.com/", "https://laravel.com/docs"],
"importance": "standard"
},
{
"id": "ruby-rails",
"name": "Ruby on Rails",
"description": "Framework web en Ruby",
"icon": "fas-code",
"links": ["https://rubyonrails.org/", "https://guides.rubyonrails.org/"]
"links": ["https://rubyonrails.org/", "https://guides.rubyonrails.org/"],
"importance": "standard"
},
{
"id": "graphql",
"name": "GraphQL",
"description": "Langage de requête pour APIs",
"icon": "fas-sitemap",
"links": ["https://graphql.org/", "https://graphql.org/learn/"]
"links": ["https://graphql.org/", "https://graphql.org/learn/"],
"importance": "standard"
},
{
"id": "prisma",
"name": "Prisma",
"description": "ORM moderne pour Node.js et TypeScript",
"icon": "fas-database",
"links": ["https://www.prisma.io/", "https://www.prisma.io/docs"]
"links": ["https://www.prisma.io/", "https://www.prisma.io/docs"],
"importance": "standard"
},
{
"id": "trpc",
"name": "tRPC",
"description": "Framework TypeScript pour APIs type-safe",
"icon": "fas-plug",
"links": ["https://trpc.io/", "https://trpc.io/docs"]
"links": ["https://trpc.io/", "https://trpc.io/docs"],
"importance": "standard"
},
{
"id": "nest-js",
"name": "NestJS",
"description": "Framework Node.js pour applications scalables",
"icon": "fas-layers",
"links": ["https://nestjs.com/", "https://docs.nestjs.com/"]
"links": ["https://nestjs.com/", "https://docs.nestjs.com/"],
"importance": "standard"
},
{
"id": "fastify",
"name": "Fastify",
"description": "Framework web rapide pour Node.js",
"icon": "fas-bolt",
"links": ["https://www.fastify.io/", "https://www.fastify.io/docs/"]
"links": ["https://www.fastify.io/", "https://www.fastify.io/docs/"],
"importance": "standard"
},
{
"id": "rabbitmq",
@@ -123,9 +137,9 @@
"links": [
"https://www.rabbitmq.com/",
"https://www.rabbitmq.com/documentation.html"
]
],
"importance": "standard"
},
{
"id": "semantic-kernel",
"name": "Semantic Kernel",
@@ -134,7 +148,8 @@
"links": [
"https://github.com/microsoft/semantic-kernel",
"https://learn.microsoft.com/en-us/semantic-kernel/"
]
],
"importance": "standard"
},
{
"id": "dotnet-core",
@@ -144,7 +159,8 @@
"links": [
"https://dotnet.microsoft.com/",
"https://docs.microsoft.com/dotnet/"
]
],
"importance": "incontournable"
},
{
"id": "asp-net-mvc",
@@ -154,7 +170,8 @@
"links": [
"https://dotnet.microsoft.com/apps/aspnet/mvc",
"https://docs.microsoft.com/aspnet/mvc/"
]
],
"importance": "incontournable"
},
{
"id": "spring-boot",
@@ -164,7 +181,8 @@
"links": [
"https://spring.io/projects/spring-boot",
"https://docs.spring.io/spring-boot/docs/current/reference/html/"
]
],
"importance": "majeure"
},
{
"id": "kafka-connect",
@@ -174,14 +192,19 @@
"links": [
"https://docs.confluent.io/platform/current/connect/index.html",
"https://kafka.apache.org/documentation/#connect"
]
],
"importance": "majeure"
},
{
"id": "oas-swagger",
"name": "OAS Swagger",
"description": "Spécification OpenAPI pour la documentation et la conception d'API RESTful",
"icon": "fas-file-code",
"links": ["https://swagger.io/specification/", "https://swagger.io/docs/"]
"links": [
"https://swagger.io/specification/",
"https://swagger.io/docs/"
],
"importance": "incontournable"
}
]
}

View File

@@ -10,7 +10,8 @@
"https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html",
"https://martinfowler.com/articles/practical-test-pyramid.html"
],
"icon": "fas-layer-group"
"icon": "fas-layer-group",
"importance": "standard"
},
{
"id": "ddd",
@@ -20,7 +21,8 @@
"https://martinfowler.com/bliki/DomainDrivenDesign.html",
"https://www.domainlanguage.com/ddd/"
],
"icon": "fas-sitemap"
"icon": "fas-sitemap",
"importance": "standard"
},
{
"id": "event-sourcing",
@@ -30,7 +32,8 @@
"https://martinfowler.com/eaaDev/EventSourcing.html",
"https://eventstore.com/docs/getting-started/"
],
"icon": "fas-history"
"icon": "fas-history",
"importance": "standard"
},
{
"id": "cqrs",
@@ -40,7 +43,8 @@
"https://martinfowler.com/bliki/CQRS.html",
"https://docs.microsoft.com/azure/architecture/patterns/cqrs"
],
"icon": "fas-exchange-alt"
"icon": "fas-exchange-alt",
"importance": "standard"
},
{
"id": "hexagonal-architecture",
@@ -50,7 +54,8 @@
"https://alistair.cockburn.us/hexagonal-architecture/",
"https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"
],
"icon": "fas-hexagon"
"icon": "fas-hexagon",
"importance": "standard"
},
{
"id": "tdd",
@@ -60,7 +65,8 @@
"https://martinfowler.com/bliki/TestDrivenDevelopment.html",
"https://www.agilealliance.org/glossary/tdd/"
],
"icon": "fas-vial"
"icon": "fas-vial",
"importance": "standard"
},
{
"id": "bdd",
@@ -70,7 +76,8 @@
"https://cucumber.io/docs/bdd/",
"https://www.agilealliance.org/glossary/bdd/"
],
"icon": "fas-comments"
"icon": "fas-comments",
"importance": "standard"
},
{
"id": "pair-programming",
@@ -80,7 +87,8 @@
"https://martinfowler.com/bliki/PairProgramming.html",
"https://www.agilealliance.org/glossary/pair-programming/"
],
"icon": "fas-users"
"icon": "fas-users",
"importance": "standard"
},
{
"id": "code-review",
@@ -90,7 +98,8 @@
"https://martinfowler.com/articles/code-review.html",
"https://github.com/features/code-review"
],
"icon": "fas-search"
"icon": "fas-search",
"importance": "standard"
},
{
"id": "refactoring",
@@ -100,7 +109,8 @@
"https://refactoring.com/",
"https://martinfowler.com/books/refactoring.html"
],
"icon": "fas-tools"
"icon": "fas-tools",
"importance": "standard"
},
{
"id": "design-patterns",
@@ -110,7 +120,8 @@
"https://refactoring.guru/design-patterns",
"https://www.oodesign.com/"
],
"icon": "fas-puzzle-piece"
"icon": "fas-puzzle-piece",
"importance": "standard"
},
{
"id": "solid-principles",
@@ -120,7 +131,8 @@
"https://en.wikipedia.org/wiki/SOLID",
"https://blog.cleancoder.com/uncle-bob/2020/10/18/SolidPrinciples.html"
],
"icon": "fas-cube"
"icon": "fas-cube",
"importance": "standard"
},
{
"id": "agile",
@@ -130,14 +142,19 @@
"https://agilemanifesto.org/",
"https://www.agilealliance.org/"
],
"icon": "fas-running"
"icon": "fas-running",
"importance": "standard"
},
{
"id": "scrum",
"name": "Scrum",
"description": "Framework agile pour le développement de produits complexes avec des équipes auto-organisées",
"links": ["https://www.scrum.org/", "https://www.scrumguides.org/"],
"icon": "fas-sync"
"links": [
"https://www.scrum.org/",
"https://www.scrumguides.org/"
],
"icon": "fas-sync",
"importance": "standard"
},
{
"id": "kanban",
@@ -147,7 +164,8 @@
"https://kanbanize.com/kanban-resources/getting-started/what-is-kanban",
"https://www.atlassian.com/agile/kanban"
],
"icon": "fas-columns"
"icon": "fas-columns",
"importance": "standard"
},
{
"id": "devops-culture",
@@ -157,7 +175,8 @@
"https://aws.amazon.com/devops/what-is-devops/",
"https://www.atlassian.com/devops"
],
"icon": "fas-handshake"
"icon": "fas-handshake",
"importance": "standard"
},
{
"id": "continuous-learning",
@@ -167,7 +186,8 @@
"https://www.thoughtworks.com/insights/blog/continuous-learning-software-development",
"https://martinfowler.com/articles/developer-productivity.html"
],
"icon": "fas-graduation-cap"
"icon": "fas-graduation-cap",
"importance": "standard"
},
{
"id": "knowledge-sharing",
@@ -177,7 +197,8 @@
"https://www.atlassian.com/team-playbook/plays/knowledge-sharing",
"https://confluence.atlassian.com/"
],
"icon": "fas-share-alt"
"icon": "fas-share-alt",
"importance": "standard"
},
{
"id": "mob-programming",
@@ -187,7 +208,8 @@
"https://mobprogramming.org/",
"https://www.agilealliance.org/glossary/mob-programming/"
],
"icon": "fas-users-cog"
"icon": "fas-users-cog",
"importance": "standard"
},
{
"id": "technical-debt",
@@ -197,7 +219,8 @@
"https://martinfowler.com/bliki/TechnicalDebt.html",
"https://www.agilealliance.org/glossary/technical-debt/"
],
"icon": "fas-credit-card"
"icon": "fas-credit-card",
"importance": "standard"
},
{
"id": "code-quality",
@@ -207,7 +230,8 @@
"https://martinfowler.com/articles/is-quality-worth-cost.html",
"https://www.sonarqube.org/"
],
"icon": "fas-star"
"icon": "fas-star",
"importance": "standard"
},
{
"id": "documentation",
@@ -217,7 +241,8 @@
"https://www.atlassian.com/software/confluence",
"https://docs.github.com/"
],
"icon": "fas-book"
"icon": "fas-book",
"importance": "standard"
}
]
}

View File

@@ -10,7 +10,8 @@
"https://www.postgresql.org/docs/",
"https://dev.mysql.com/doc/"
],
"icon": "fas-database"
"icon": "fas-database",
"importance": "incontournable"
},
{
"id": "postgresql",
@@ -20,21 +21,24 @@
"https://www.postgresql.org/",
"https://www.postgresql.org/docs/"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "mongodb",
"name": "MongoDB",
"description": "Base de données NoSQL orientée documents",
"links": ["https://www.mongodb.com/", "https://docs.mongodb.com/"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "incontournable"
},
{
"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/"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "elasticsearch",
@@ -44,21 +48,24 @@
"https://www.elastic.co/elasticsearch/",
"https://www.elastic.co/guide/"
],
"icon": "fas-search"
"icon": "fas-search",
"importance": "standard"
},
{
"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/"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "tableau",
"name": "Tableau",
"description": "Plateforme de visualisation de données",
"links": ["https://www.tableau.com/", "https://help.tableau.com/"],
"icon": "fas-chart"
"icon": "fas-chart",
"importance": "standard"
},
{
"id": "powerbi",
@@ -68,14 +75,16 @@
"https://powerbi.microsoft.com/",
"https://docs.microsoft.com/power-bi/"
],
"icon": "fab-microsoft"
"icon": "fab-microsoft",
"importance": "standard"
},
{
"id": "spark",
"name": "Apache Spark",
"description": "Moteur de traitement de données distribuées",
"links": ["https://spark.apache.org/", "https://spark.apache.org/docs/"],
"icon": "fas-bolt"
"icon": "fas-bolt",
"importance": "standard"
},
{
"id": "airflow",
@@ -85,14 +94,16 @@
"https://airflow.apache.org/",
"https://airflow.apache.org/docs/"
],
"icon": "fas-stream"
"icon": "fas-stream",
"importance": "standard"
},
{
"id": "talend",
"name": "Talend",
"description": "Plateforme open source et commerciale d'intégration de données offrant une interface graphique pour l'ETL, le traitement batch et temps réel",
"links": ["https://www.talend.com/", "https://help.talend.com/"],
"icon": "fas-database"
"icon": "fas-database",
"importance": "majeure"
},
{
"id": "kafka",
@@ -102,7 +113,8 @@
"https://kafka.apache.org/",
"https://kafka.apache.org/documentation/"
],
"icon": "fas-stream"
"icon": "fas-stream",
"importance": "incontournable"
},
{
"id": "dragonfly",
@@ -112,7 +124,8 @@
"https://www.dragonflydb.io/",
"https://www.dragonflydb.io/docs"
],
"icon": "fas-database"
"icon": "fas-database",
"importance": "standard"
},
{
"id": "sqlserver",
@@ -122,29 +135,32 @@
"https://www.microsoft.com/fr-fr/sql-server/",
"https://docs.microsoft.com/sql/"
],
"icon": "fab-microsoft"
"icon": "fab-microsoft",
"importance": "majeure"
},
{
"id": "snowflake",
"name": "Snowflake",
"description": "Plateforme de data warehouse cloud-native permettant l'analyse de données à grande échelle",
"links": ["https://www.snowflake.com/", "https://docs.snowflake.com/"],
"icon": "fas-cloud"
"icon": "fas-cloud",
"importance": "standard"
},
{
"id": "solr",
"name": "SolR",
"description": "Plateforme de recherche open source basée sur Apache Lucene, optimisée pour la recherche en texte intégral",
"links": ["https://solr.apache.org/", "https://solr.apache.org/guide/"],
"icon": "fas-search"
"icon": "fas-search",
"importance": "standard"
},
{
"id": "opensearch",
"name": "OpenSearch",
"description": "Fork d'Elasticsearch, offrant des fonctionnalités de recherche et d'analyse de données distribuées",
"links": ["https://opensearch.org/", "https://opensearch.org/docs/"],
"icon": "fas-search"
"icon": "fas-search",
"importance": "standard"
}
]
}

View File

@@ -6,21 +6,17 @@
"id": "figma",
"name": "Figma",
"description": "Outil de design d'interface collaboratif",
"links": [
"https://www.figma.com/",
"https://help.figma.com/"
],
"icon": "fab-figma"
"links": ["https://www.figma.com/", "https://help.figma.com/"],
"icon": "fab-figma",
"importance": "standard"
},
{
"id": "sketch",
"name": "Sketch",
"description": "Outil de design d'interface pour macOS",
"links": [
"https://www.sketch.com/",
"https://www.sketch.com/docs/"
],
"icon": "fab-sketch"
"links": ["https://www.sketch.com/", "https://www.sketch.com/docs/"],
"icon": "fab-sketch",
"importance": "standard"
},
{
"id": "adobe-xd",
@@ -30,17 +26,16 @@
"https://www.adobe.com/products/xd.html",
"https://helpx.adobe.com/xd/"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"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/"
],
"icon": "fas-cog"
"links": ["https://www.nngroup.com/", "https://material.io/design/"],
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "design-system",
@@ -50,17 +45,16 @@
"https://designsystemsrepo.com/",
"https://www.designbetter.co/design-systems-handbook"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "majeure"
},
{
"id": "prototyping",
"name": "Prototypage",
"description": "Création de prototypes interactifs",
"links": [
"https://www.prototypr.io/",
"https://www.invisionapp.com/"
],
"icon": "fas-palette"
"links": ["https://www.prototypr.io/", "https://www.invisionapp.com/"],
"icon": "fas-palette",
"importance": "standard"
},
{
"id": "user-research",
@@ -70,17 +64,16 @@
"https://www.nngroup.com/articles/",
"https://www.usability.gov/"
],
"icon": "fas-users"
"icon": "fas-users",
"importance": "standard"
},
{
"id": "accessibility",
"name": "Accessibilité",
"description": "Design accessible et inclusive",
"links": [
"https://www.w3.org/WAI/",
"https://webaim.org/"
],
"icon": "fas-eye"
"links": ["https://www.w3.org/WAI/", "https://webaim.org/"],
"icon": "fas-eye",
"importance": "majeure"
},
{
"id": "responsive-design",
@@ -90,7 +83,8 @@
"https://developers.google.com/web/fundamentals/design-and-ux/responsive",
"https://responsivedesign.is/"
],
"icon": "fas-mobile"
"icon": "fas-mobile",
"importance": "majeure"
},
{
"id": "motion-design",
@@ -100,7 +94,8 @@
"https://material.io/design/motion/",
"https://www.framer.com/"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
}
]
}

View File

@@ -11,7 +11,8 @@
"https://docs.docker.com/",
"https://github.com/docker/docker-ce"
],
"icon": "fab-docker"
"icon": "fab-docker",
"importance": "incontournable"
},
{
"id": "kubernetes",
@@ -22,7 +23,8 @@
"https://kubernetes.io/docs/",
"https://github.com/kubernetes/kubernetes"
],
"icon": "fas-layers"
"icon": "fas-layers",
"importance": "incontournable"
},
{
"id": "aws",
@@ -33,7 +35,8 @@
"https://docs.aws.amazon.com/",
"https://github.com/aws"
],
"icon": "fab-aws"
"icon": "fab-aws",
"importance": "standard"
},
{
"id": "terraform",
@@ -44,7 +47,8 @@
"https://learn.hashicorp.com/terraform",
"https://github.com/hashicorp/terraform"
],
"icon": "fas-tools"
"icon": "fas-tools",
"importance": "standard"
},
{
"id": "jenkins",
@@ -55,7 +59,8 @@
"https://www.jenkins.io/doc/",
"https://github.com/jenkinsci/jenkins"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "githubactions",
@@ -66,14 +71,16 @@
"https://docs.github.com/en/actions",
"https://github.com/actions"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "ansible",
"name": "Ansible",
"description": "Outil d'automatisation IT et de gestion de configuration",
"links": ["https://www.ansible.com/", "https://docs.ansible.com/"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "gitlab-ci",
@@ -83,21 +90,24 @@
"https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/",
"https://docs.gitlab.com/ee/ci/"
],
"icon": "fab-gitlab"
"icon": "fab-gitlab",
"importance": "standard"
},
{
"id": "prometheus",
"name": "Prometheus",
"description": "Système de monitoring et d'alerting",
"links": ["https://prometheus.io/", "https://prometheus.io/docs/"],
"icon": "fas-chart-line"
"icon": "fas-chart-line",
"importance": "majeure"
},
{
"id": "grafana",
"name": "Grafana",
"description": "Plateforme de visualisation et monitoring",
"links": ["https://grafana.com/", "https://grafana.com/docs/"],
"icon": "fas-chart-line"
"icon": "fas-chart-line",
"importance": "incontournable"
},
{
"id": "elk-stack",
@@ -107,50 +117,56 @@
"https://www.elastic.co/what-is/elk-stack",
"https://www.elastic.co/guide/"
],
"icon": "fas-search"
"icon": "fas-search",
"importance": "standard"
},
{
"id": "nginx",
"name": "Nginx",
"description": "Serveur web et proxy inverse",
"links": ["https://nginx.org/", "https://nginx.org/en/docs/"],
"icon": "fas-server"
"icon": "fas-server",
"importance": "majeure"
},
{
"id": "apache",
"name": "Apache HTTP Server",
"description": "Serveur web open source",
"links": ["https://httpd.apache.org/", "https://httpd.apache.org/docs/"],
"icon": "fas-server"
"icon": "fas-server",
"importance": "standard"
},
{
"id": "traefik",
"name": "Traefik",
"description": "Proxy inverse moderne et load balancer",
"links": ["https://traefik.io/", "https://doc.traefik.io/"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "helm",
"name": "Helm",
"description": "Gestionnaire de packages pour Kubernetes",
"links": ["https://helm.sh/", "https://helm.sh/docs/"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "istio",
"name": "Istio",
"description": "Service mesh pour microservices",
"links": ["https://istio.io/", "https://istio.io/latest/docs/"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "consul",
"name": "HashiCorp Consul",
"description": "Service discovery et configuration",
"links": ["https://www.consul.io/", "https://learn.hashicorp.com/consul"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "nomad",
@@ -160,29 +176,32 @@
"https://www.nomadproject.io/",
"https://learn.hashicorp.com/nomad"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "kong",
"name": "Kong",
"description": "Gateway API open source pour la gestion, la sécurisation et le monitoring des API avec support de plugins",
"links": ["https://konghq.com/", "https://docs.konghq.com/"],
"icon": "fas-door-open"
"icon": "fas-door-open",
"importance": "majeure"
},
{
"id": "ceph",
"name": "Ceph",
"description": "Système de stockage distribué open source offrant des services d'objets, de blocs et de fichiers",
"links": ["https://ceph.io/", "https://docs.ceph.com/"],
"icon": "fas-hdd"
"icon": "fas-hdd",
"importance": "majeure"
},
{
"id": "harbor",
"name": "Harbor",
"description": "Registre de conteneurs open source pour le stockage et la distribution sécurisée des images Docker",
"links": ["https://goharbor.io/", "https://goharbor.io/docs/"],
"icon": "fas-ship"
"icon": "fas-ship",
"importance": "incontournable"
},
{
"id": "zabbix",
@@ -192,7 +211,8 @@
"https://www.zabbix.com/",
"https://www.zabbix.com/documentation"
],
"icon": "fas-chart-line"
"icon": "fas-chart-line",
"importance": "standard"
},
{
"id": "nutanix",
@@ -202,14 +222,16 @@
"https://www.nutanix.com/",
"https://portal.nutanix.com/page/documents"
],
"icon": "fas-server"
"icon": "fas-server",
"importance": "standard"
},
{
"id": "backstage",
"name": "Backstage",
"description": "Plateforme de portail développeur open source pour centraliser la documentation, les services et les outils de développement",
"links": ["https://backstage.io/", "https://backstage.io/docs/"],
"icon": "fas-home"
"icon": "fas-home",
"importance": "standard"
},
{
"id": "cohesity",
@@ -219,22 +241,24 @@
"https://www.cohesity.com/",
"https://www.cohesity.com/support/"
],
"icon": "fas-database"
"icon": "fas-database",
"importance": "standard"
},
{
"id": "sonar",
"name": "Sonar",
"description": "Plateforme d'analyse statique de code multi-langage pour la détection des bugs, vulnérabilités et code smells",
"links": ["https://www.sonarsource.com/", "https://docs.sonarqube.org/"],
"icon": "fas-search"
"icon": "fas-search",
"importance": "majeure"
},
{
"id": "git",
"name": "Git",
"description": "Système de contrôle de version distribué pour le suivi des modifications du code source",
"links": ["https://git-scm.com/", "https://git-scm.com/doc"],
"icon": "fab-git"
"icon": "fab-git",
"importance": "incontournable"
},
{
"id": "trivy",
@@ -244,30 +268,32 @@
"https://aquasecurity.github.io/trivy/",
"https://aquasecurity.github.io/trivy/latest/docs/"
],
"icon": "fas-shield-alt"
"icon": "fas-shield-alt",
"importance": "standard"
},
{
"id": "checkmarx",
"name": "Checkmarx",
"description": "Solution d'analyse de sécurité applicative (SAST) pour la détection des vulnérabilités dans le code source",
"links": ["https://checkmarx.com/", "https://checkmarx.com/resources/"],
"icon": "fas-shield-alt"
"icon": "fas-shield-alt",
"importance": "standard"
},
{
"id": "liquibase",
"name": "Liquibase",
"description": "Outil de gestion des changements de base de données pour le versioning et le déploiement des schémas",
"links": ["https://www.liquibase.org/", "https://docs.liquibase.com/"],
"icon": "fas-database"
"icon": "fas-database",
"importance": "standard"
},
{
"id": "puppet",
"name": "Puppet",
"description": "Plateforme de gestion de configuration et d'automatisation infrastructure permettant le déploiement et la conformité des systèmes",
"links": ["https://puppet.com/", "https://puppet.com/docs/"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "azure-devops",
@@ -277,7 +303,8 @@
"https://azure.microsoft.com/fr-fr/services/devops/server/",
"https://docs.microsoft.com/azure/devops/"
],
"icon": "fab-microsoft"
"icon": "fab-microsoft",
"importance": "majeure"
},
{
"id": "nexus",
@@ -287,7 +314,8 @@
"https://www.sonatype.com/products/sonatype-nexus-repository",
"https://help.sonatype.com/repomanager3/"
],
"icon": "fas-archive"
"icon": "fas-archive",
"importance": "standard"
}
]
}

View File

@@ -11,7 +11,8 @@
"https://react.dev/",
"https://react.dev/learn",
"https://github.com/facebook/react"
]
],
"importance": "incontournable"
},
{
"id": "vue",
@@ -22,7 +23,8 @@
"https://vuejs.org/",
"https://vuejs.org/guide/",
"https://github.com/vuejs/core"
]
],
"importance": "standard"
},
{
"id": "typescript",
@@ -33,7 +35,8 @@
"https://www.typescriptlang.org/",
"https://www.typescriptlang.org/docs/",
"https://github.com/microsoft/TypeScript"
]
],
"importance": "incontournable"
},
{
"id": "nextjs",
@@ -44,7 +47,8 @@
"https://nextjs.org/",
"https://nextjs.org/docs",
"https://github.com/vercel/next.js"
]
],
"importance": "majeure"
},
{
"id": "tailwindcss",
@@ -55,7 +59,8 @@
"https://tailwindcss.com/",
"https://tailwindcss.com/docs",
"https://github.com/tailwindlabs/tailwindcss"
]
],
"importance": "standard"
},
{
"id": "webpack",
@@ -66,78 +71,88 @@
"https://webpack.js.org/",
"https://webpack.js.org/concepts/",
"https://github.com/webpack/webpack"
]
],
"importance": "majeure"
},
{
"id": "vite",
"name": "Vite",
"description": "Outil de build rapide pour applications modernes",
"icon": "fas-bolt",
"links": ["https://vitejs.dev/", "https://vitejs.dev/guide/"]
"links": ["https://vitejs.dev/", "https://vitejs.dev/guide/"],
"importance": "standard"
},
{
"id": "svelte",
"name": "Svelte",
"description": "Framework de compilation pour interfaces utilisateur",
"icon": "fas-code",
"links": ["https://svelte.dev/", "https://svelte.dev/docs"]
"links": ["https://svelte.dev/", "https://svelte.dev/docs"],
"importance": "standard"
},
{
"id": "solidjs",
"name": "SolidJS",
"description": "Framework JavaScript réactif et performant",
"icon": "fas-atom",
"links": ["https://www.solidjs.com/", "https://www.solidjs.com/docs"]
"links": ["https://www.solidjs.com/", "https://www.solidjs.com/docs"],
"importance": "standard"
},
{
"id": "astro",
"name": "Astro",
"description": "Framework statique multi-framework",
"icon": "fas-rocket",
"links": ["https://astro.build/", "https://docs.astro.build/"]
"links": ["https://astro.build/", "https://docs.astro.build/"],
"importance": "standard"
},
{
"id": "remix",
"name": "Remix",
"description": "Framework full-stack centré sur les standards web",
"icon": "fas-sync",
"links": ["https://remix.run/", "https://remix.run/docs"]
"links": ["https://remix.run/", "https://remix.run/docs"],
"importance": "standard"
},
{
"id": "storybook",
"name": "Storybook",
"description": "Outil de développement pour composants UI",
"icon": "fas-book",
"links": ["https://storybook.js.org/", "https://storybook.js.org/docs"]
"links": ["https://storybook.js.org/", "https://storybook.js.org/docs"],
"importance": "majeure"
},
{
"id": "playwright",
"name": "Playwright",
"description": "Framework de tests pour applications web",
"icon": "fas-flask",
"links": ["https://playwright.dev/", "https://playwright.dev/docs/"]
"links": ["https://playwright.dev/", "https://playwright.dev/docs/"],
"importance": "standard"
},
{
"id": "three-js",
"name": "Three.js",
"description": "Bibliothèque JavaScript pour 3D dans le navigateur",
"icon": "fas-cube",
"links": ["https://threejs.org/", "https://threejs.org/docs/"]
"links": ["https://threejs.org/", "https://threejs.org/docs/"],
"importance": "standard"
},
{
"id": "d3",
"name": "D3.js",
"description": "Bibliothèque de visualisation de données",
"icon": "fas-chart-line",
"links": ["https://d3js.org/", "https://github.com/d3/d3/wiki"]
"links": ["https://d3js.org/", "https://github.com/d3/d3/wiki"],
"importance": "standard"
},
{
"id": "gsap",
"name": "GSAP",
"description": "Bibliothèque d'animations web performantes",
"icon": "fas-bolt",
"links": ["https://greensock.com/gsap/", "https://greensock.com/docs/"]
"links": ["https://greensock.com/gsap/", "https://greensock.com/docs/"],
"importance": "standard"
},
{
"id": "web-components",
@@ -147,7 +162,8 @@
"links": [
"https://developer.mozilla.org/en-US/docs/Web/Web_Components",
"https://web.dev/web-components/"
]
],
"importance": "standard"
},
{
"id": "pwa",
@@ -157,7 +173,8 @@
"links": [
"https://web.dev/progressive-web-apps/",
"https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps"
]
],
"importance": "standard"
},
{
"id": "reactjs",
@@ -167,9 +184,9 @@
"links": [
"https://reactjs.org/",
"https://reactjs.org/docs/getting-started.html"
]
],
"importance": "standard"
},
{
"id": "html5-javascript-css",
"name": "HTML5/JavaScript/CSS",
@@ -178,7 +195,8 @@
"links": [
"https://developer.mozilla.org/fr/",
"https://developer.mozilla.org/fr/docs/Web"
]
],
"importance": "standard"
}
]
}

View File

@@ -11,7 +11,8 @@
"https://reactnative.dev/docs/getting-started",
"https://github.com/facebook/react-native"
],
"icon": "fab-react"
"icon": "fab-react",
"importance": "standard"
},
{
"id": "flutter",
@@ -22,7 +23,8 @@
"https://docs.flutter.dev/",
"https://github.com/flutter/flutter"
],
"icon": "fas-mobile"
"icon": "fas-mobile",
"importance": "standard"
},
{
"id": "swift",
@@ -33,7 +35,8 @@
"https://docs.swift.org/swift-book/",
"https://github.com/apple/swift"
],
"icon": "fab-swift"
"icon": "fab-swift",
"importance": "standard"
},
{
"id": "kotlin",
@@ -44,7 +47,8 @@
"https://kotlinlang.org/docs/",
"https://github.com/JetBrains/kotlin"
],
"icon": "fab-android"
"icon": "fab-android",
"importance": "standard"
},
{
"id": "expo",
@@ -55,7 +59,8 @@
"https://docs.expo.dev/",
"https://github.com/expo/expo"
],
"icon": "fab-react"
"icon": "fab-react",
"importance": "standard"
},
{
"id": "ionic",
@@ -65,7 +70,8 @@
"https://ionicframework.com/",
"https://ionicframework.com/docs"
],
"icon": "fas-mobile"
"icon": "fas-mobile",
"importance": "standard"
},
{
"id": "xamarin",
@@ -75,14 +81,19 @@
"https://dotnet.microsoft.com/apps/xamarin",
"https://docs.microsoft.com/xamarin/"
],
"icon": "fab-microsoft"
"icon": "fab-microsoft",
"importance": "standard"
},
{
"id": "unity",
"name": "Unity",
"description": "Moteur de jeu pour applications mobiles",
"links": ["https://unity.com/", "https://docs.unity3d.com/"],
"icon": "fas-cube"
"links": [
"https://unity.com/",
"https://docs.unity3d.com/"
],
"icon": "fas-cube",
"importance": "standard"
},
{
"id": "cordova",
@@ -92,21 +103,30 @@
"https://cordova.apache.org/",
"https://cordova.apache.org/docs/"
],
"icon": "fas-mobile"
"icon": "fas-mobile",
"importance": "standard"
},
{
"id": "capacitor",
"name": "Capacitor",
"description": "Runtime natif pour applications web",
"links": ["https://capacitorjs.com/", "https://capacitorjs.com/docs"],
"icon": "fas-cog"
"links": [
"https://capacitorjs.com/",
"https://capacitorjs.com/docs"
],
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "fastlane",
"name": "Fastlane",
"description": "Automatisation pour développement mobile",
"links": ["https://fastlane.tools/", "https://docs.fastlane.tools/"],
"icon": "fas-cog"
"links": [
"https://fastlane.tools/",
"https://docs.fastlane.tools/"
],
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "firebase",
@@ -116,7 +136,8 @@
"https://firebase.google.com/",
"https://firebase.google.com/docs"
],
"icon": "fab-google"
"icon": "fab-google",
"importance": "standard"
},
{
"id": "app-store-optimization",
@@ -126,14 +147,19 @@
"https://developer.apple.com/app-store/",
"https://play.google.com/console/"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "mobile-testing",
"name": "Tests Mobile",
"description": "Frameworks de tests pour applications mobiles",
"links": ["https://appium.io/", "https://detox.js.org/"],
"icon": "fas-bug"
"links": [
"https://appium.io/",
"https://detox.js.org/"
],
"icon": "fas-bug",
"importance": "standard"
},
{
"id": "mobile-performance",
@@ -143,7 +169,8 @@
"https://developers.google.com/web/tools/lighthouse",
"https://developer.android.com/topic/performance"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "push-notifications",
@@ -153,7 +180,8 @@
"https://firebase.google.com/docs/cloud-messaging",
"https://developer.apple.com/notifications/"
],
"icon": "fas-bell"
"icon": "fas-bell",
"importance": "standard"
}
]
}

View File

@@ -7,14 +7,16 @@
"name": "OAuth 2.0",
"description": "Framework d'autorisation pour APIs",
"links": ["https://oauth.net/2/", "https://tools.ietf.org/html/rfc6749"],
"icon": "fas-key"
"icon": "fas-key",
"importance": "standard"
},
{
"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"],
"icon": "fas-shield"
"icon": "fas-shield",
"importance": "standard"
},
{
"id": "https-ssl",
@@ -24,14 +26,16 @@
"https://developer.mozilla.org/en-US/docs/Web/Security",
"https://letsencrypt.org/"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "owasp",
"name": "OWASP",
"description": "Bonnes pratiques de sécurité des applications web",
"links": ["https://owasp.org/", "https://owasp.org/www-project-top-ten/"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "csrf-xss",
@@ -41,7 +45,8 @@
"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"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "penetration-testing",
@@ -51,7 +56,8 @@
"https://owasp.org/www-community/Penetration_Testing_Methodologies",
"https://www.kali.org/"
],
"icon": "fas-user-shield"
"icon": "fas-user-shield",
"importance": "standard"
},
{
"id": "cryptography",
@@ -61,14 +67,16 @@
"https://cryptography.io/",
"https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "auth0",
"name": "Auth0",
"description": "Plateforme d'authentification et d'autorisation",
"links": ["https://auth0.com/", "https://auth0.com/docs"],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "standard"
},
{
"id": "keycloak",
@@ -78,7 +86,8 @@
"https://www.keycloak.org/",
"https://www.keycloak.org/documentation"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "incontournable"
},
{
"id": "vault",
@@ -88,7 +97,8 @@
"https://www.vaultproject.io/",
"https://learn.hashicorp.com/vault"
],
"icon": "fas-cog"
"icon": "fas-cog",
"importance": "incontournable"
},
{
"id": "sentinelone",
@@ -98,7 +108,8 @@
"https://www.sentinelone.com/",
"https://docs.sentinelone.com/"
],
"icon": "fas-shield-alt"
"icon": "fas-shield-alt",
"importance": "standard"
},
{
"id": "forescout",
@@ -108,7 +119,8 @@
"https://www.forescout.com/",
"https://www.forescout.com/support/"
],
"icon": "fas-network-wired"
"icon": "fas-network-wired",
"importance": "standard"
}
]
}

View File

@@ -10,21 +10,24 @@
"https://www.selenium.dev/",
"https://www.selenium.dev/documentation/"
],
"icon": "fas-bug"
"icon": "fas-bug",
"importance": "standard"
},
{
"id": "cypress",
"name": "Cypress",
"description": "Framework de test JS end-to-end moderne pour les applications web avec interface de développement intégrée",
"links": ["https://www.cypress.io/", "https://docs.cypress.io/"],
"icon": "fas-bug"
"icon": "fas-bug",
"importance": "standard"
},
{
"id": "k6",
"name": "K6",
"description": "Outil de test de charge open source en JS pour la performance et le stress testing des applications",
"links": ["https://k6.io/", "https://k6.io/docs/"],
"icon": "fas-tachometer-alt"
"icon": "fas-tachometer-alt",
"importance": "standard"
},
{
"id": "jmeter",
@@ -34,7 +37,8 @@
"https://jmeter.apache.org/",
"https://jmeter.apache.org/usermanual/"
],
"icon": "fas-chart-line"
"icon": "fas-chart-line",
"importance": "standard"
},
{
"id": "robot-framework",
@@ -44,7 +48,8 @@
"https://robotframework.org/",
"https://robotframework.org/robotframework/"
],
"icon": "fas-robot"
"icon": "fas-robot",
"importance": "majeure"
},
{
"id": "mutation-testing",
@@ -54,7 +59,8 @@
"https://en.wikipedia.org/wiki/Mutation_testing",
"https://stryker-mutator.io/docs/mutation-testing-elements/what-is-mutation-testing"
],
"icon": "fas-dna"
"icon": "fas-dna",
"importance": "majeure"
},
{
"id": "stryker",
@@ -64,14 +70,16 @@
"https://stryker-mutator.io/",
"https://stryker-mutator.io/docs/"
],
"icon": "fas-bug"
"icon": "fas-bug",
"importance": "majeure"
},
{
"id": "pitest",
"name": "Pitest",
"description": "Framework de tests de mutation pour Java et JVM",
"links": ["https://pitest.org/", "https://pitest.org/quickstart/"],
"icon": "fab-java"
"icon": "fab-java",
"importance": "majeure"
},
{
"id": "pytest-mutmut",
@@ -81,7 +89,8 @@
"https://github.com/boxed/mutmut",
"https://mutmut.readthedocs.io/"
],
"icon": "fab-python"
"icon": "fab-python",
"importance": "standard"
}
]
}

View File

@@ -85,6 +85,7 @@ async function syncSkillsToDatabase(): Promise<void> {
const needsUpdate = existingSkill
? existingSkill.description !== skillFromFile.description ||
existingSkill.icon !== skillFromFile.icon ||
existingSkill.importance !== skillFromFile.importance ||
JSON.stringify(existingSkill.links?.sort()) !==
JSON.stringify(skillFromFile.links?.sort())
: true;

View File

@@ -63,6 +63,7 @@ export class SkillsService {
s.name,
s.description,
s.icon,
s.importance,
COALESCE(
json_agg(sl.url ORDER BY sl.id) FILTER (WHERE sl.url IS NOT NULL),
'[]'::json
@@ -70,7 +71,7 @@ export class SkillsService {
FROM skills s
LEFT JOIN skill_links sl ON s.id = sl.skill_id
WHERE s.category_id = $1
GROUP BY s.id, s.name, s.description, s.icon
GROUP BY s.id, s.name, s.description, s.icon, s.importance
ORDER BY s.name
`;
@@ -81,6 +82,7 @@ export class SkillsService {
name: row.name,
description: row.description,
icon: row.icon,
importance: row.importance,
links: row.links,
}));
} catch (error) {
@@ -121,6 +123,7 @@ export class SkillsService {
icon?: string;
categoryId: string;
links: string[];
importance?: string;
}): Promise<void> {
const pool = getPool();
const client = await pool.connect();
@@ -130,8 +133,8 @@ export class SkillsService {
// Insert skill
const skillQuery = `
INSERT INTO skills (id, name, description, icon, category_id)
VALUES ($1, $2, $3, $4, $5)
INSERT INTO skills (id, name, description, icon, category_id, importance)
VALUES ($1, $2, $3, $4, $5, $6)
`;
await client.query(skillQuery, [
skill.id,
@@ -139,6 +142,7 @@ export class SkillsService {
skill.description,
skill.icon,
skill.categoryId,
skill.importance || "standard",
]);
// Insert links
@@ -194,13 +198,14 @@ export class SkillsService {
// Insert skills
for (const skill of categoryData.skills) {
const skillQuery = `
INSERT INTO skills (id, name, description, icon, category_id)
VALUES ($1, $2, $3, $4, $5)
INSERT INTO skills (id, name, description, icon, category_id, importance)
VALUES ($1, $2, $3, $4, $5, $6)
ON CONFLICT (id) DO UPDATE SET
name = EXCLUDED.name,
description = EXCLUDED.description,
icon = EXCLUDED.icon,
category_id = EXCLUDED.category_id
category_id = EXCLUDED.category_id,
importance = EXCLUDED.importance
`;
await client.query(skillQuery, [
skill.id,
@@ -208,6 +213,7 @@ export class SkillsService {
skill.description,
skill.icon,
categoryId,
skill.importance || "standard",
]);
// Delete existing links
@@ -324,6 +330,7 @@ export class SkillsService {
categoryId: string;
description?: string;
icon?: string;
importance?: string;
}): Promise<{
id: string;
name: string;
@@ -332,6 +339,7 @@ export class SkillsService {
categoryId: string;
category: string;
usageCount: number;
importance: string;
}> {
const pool = getPool();
const client = await pool.connect();
@@ -351,10 +359,16 @@ export class SkillsService {
// Créer la nouvelle skill
const result = await client.query(
`INSERT INTO skills (id, name, category_id, description, icon)
VALUES (gen_random_uuid(), $1, $2, $3, $4)
RETURNING id, name, description, icon, category_id`,
[data.name, data.categoryId, data.description || "", data.icon || ""]
`INSERT INTO skills (id, name, category_id, description, icon, importance)
VALUES (gen_random_uuid(), $1, $2, $3, $4, $5)
RETURNING id, name, description, icon, category_id, importance`,
[
data.name,
data.categoryId,
data.description || "",
data.icon || "",
data.importance || "standard",
]
);
const newSkill = result.rows[0];
@@ -375,6 +389,7 @@ export class SkillsService {
categoryId: newSkill.category_id,
category: categoryResult.rows[0]?.name || "Inconnue",
usageCount: 0,
importance: newSkill.importance,
};
} catch (error) {
await client.query("ROLLBACK");
@@ -393,6 +408,7 @@ export class SkillsService {
categoryId: string;
description?: string;
icon?: string;
importance?: string;
}): Promise<{
id: string;
name: string;
@@ -400,6 +416,7 @@ export class SkillsService {
icon: string;
categoryId: string;
category: string;
importance: string;
}> {
const pool = getPool();
const client = await pool.connect();
@@ -430,20 +447,21 @@ export class SkillsService {
// Mettre à jour la skill
await client.query(
`UPDATE skills
SET name = $1, category_id = $2, description = $3, icon = $4
WHERE id = $5`,
SET name = $1, category_id = $2, description = $3, icon = $4, importance = $5
WHERE id = $6`,
[
data.name,
data.categoryId,
data.description || "",
data.icon || "",
data.importance || "standard",
data.id,
]
);
// Récupérer la skill mise à jour
const result = await client.query(
`SELECT s.id, s.name, s.description, s.icon, s.category_id, sc.name as category_name
`SELECT s.id, s.name, s.description, s.icon, s.category_id, sc.name as category_name, s.importance
FROM skills s
LEFT JOIN skill_categories sc ON s.category_id = sc.id
WHERE s.id = $1`,
@@ -460,6 +478,7 @@ export class SkillsService {
icon: skill.icon,
categoryId: skill.category_id,
category: skill.category_name,
importance: skill.importance,
};
} catch (error) {
await client.query("ROLLBACK");