Skip to content

Commit ea494fe

Browse files
Y-RyuZUclaude
andcommitted
feat: implement centralized skill level management and add new skills
- Create skill-levels.ts for centralized skill proficiency management - Add new skills: Hardware, Tauri, C#, and Nuxt.js - Create "Other Technologies" category for beginner-level skills - Update all skill definitions to use centralized proficiency mapping - Add appropriate icons for all new skills This change makes skill level management more maintainable by centralizing all proficiency levels in one location, making it easier to update skills as proficiency improves. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 616d1fd commit ea494fe

4 files changed

Lines changed: 143 additions & 25 deletions

File tree

src/lib/constants/skill-icons.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ import {
4343
FaChartBar,
4444
} from 'react-icons/fa';
4545

46+
// Other Technology icons
47+
import {
48+
SiTauri,
49+
SiNuxtdotjs,
50+
} from 'react-icons/si';
51+
import {
52+
FaMicrochip,
53+
} from 'react-icons/fa';
54+
import { TbBrandCSharp } from 'react-icons/tb';
55+
4656
// 型安全なアイコンマッピング
4757
export const SKILL_ICONS: Record<SkillName, IconType> = {
4858
// Backend
@@ -52,12 +62,15 @@ export const SKILL_ICONS: Record<SkillName, IconType> = {
5262
'Python': SiPython,
5363
'Spring Boot': SiSpring,
5464
'Ktor': SiKotlin, // Ktorは専用アイコンがないためKotlinを使用
65+
'C#': TbBrandCSharp,
5566

5667
// Frontend
5768
'React': SiReact,
5869
'Vue.js': SiVuedotjs,
5970
'Next.js': SiNextdotjs,
71+
'Nuxt.js': SiNuxtdotjs,
6072
'TailwindCSS': SiTailwindcss,
73+
'Tauri': SiTauri,
6174

6275
// Infrastructure
6376
'Proxmox': FaServer, // Proxmoxは専用アイコンがないためサーバーアイコン
@@ -75,6 +88,9 @@ export const SKILL_ICONS: Record<SkillName, IconType> = {
7588
// ML/DS
7689
'LLM Integration': FaBrain,
7790
'Data Analysis': FaChartBar,
91+
92+
// Other Technologies
93+
'Hardware': FaMicrochip,
7894
} as const;
7995

8096
// Special badges for skills

src/lib/constants/skill-levels.ts

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import type {SkillName, ProficiencyLevel} from '@/lib/types/skill';
2+
3+
/**
4+
* Centralized skill proficiency level management
5+
* スキルの熟練度レベルを一元管理
6+
*
7+
* When you level up a skill, update it here!
8+
* スキルレベルが上がったら、ここを更新してください!
9+
*/
10+
export const SKILL_PROFICIENCY_MAP: Record<SkillName, ProficiencyLevel> = {
11+
// Backend
12+
'Java': 'expert',
13+
'Kotlin': 'expert',
14+
'Spring Boot': 'advanced',
15+
'Ktor': 'advanced',
16+
17+
// Frontend
18+
'React': 'advanced',
19+
'Vue.js': 'advanced',
20+
'Next.js': 'advanced',
21+
'Nuxt.js': 'advanced',
22+
'TailwindCSS': 'advanced',
23+
24+
// Programming Languages
25+
'TypeScript': 'advanced',
26+
'Python': 'advanced', // Note: Different levels for different contexts
27+
28+
// Infrastructure & Cloud
29+
'Proxmox': 'advanced',
30+
'Kubernetes': 'advanced',
31+
'Docker': 'advanced',
32+
'AWS': 'intermediate',
33+
'GCP': 'advanced',
34+
'GitHub Actions': 'advanced',
35+
36+
// Database
37+
'MySQL/MariaDB': 'advanced',
38+
'PostgreSQL': 'advanced',
39+
'Redis': 'advanced',
40+
41+
// ML/DS
42+
'LLM Integration': 'intermediate',
43+
'Data Analysis': 'advanced',
44+
45+
// Other Technologies
46+
'Hardware': 'beginner',
47+
'Tauri': 'beginner',
48+
'C#': 'beginner',
49+
} as const;
50+
51+
/**
52+
* Get proficiency level for a specific skill
53+
* @param skillName - Name of the skill
54+
* @returns Proficiency level or 'beginner' as default
55+
*/
56+
export function getSkillProficiency(skillName: SkillName): ProficiencyLevel {
57+
return SKILL_PROFICIENCY_MAP[skillName] || 'beginner';
58+
}
59+
60+
/**
61+
* Get all skills by proficiency level
62+
* @param level - Proficiency level to filter by
63+
* @returns Array of skill names with that proficiency level
64+
*/
65+
export function getSkillsByProficiency(level: ProficiencyLevel): SkillName[] {
66+
return (Object.entries(SKILL_PROFICIENCY_MAP) as [SkillName, ProficiencyLevel][])
67+
.filter(([, proficiency]) => proficiency === level)
68+
.map(([skillName]) => skillName);
69+
}
70+
71+
/**
72+
* Statistics about skill proficiency distribution
73+
*/
74+
export function getProficiencyStats(): Record<ProficiencyLevel, number> {
75+
const stats: Record<ProficiencyLevel, number> = {
76+
expert: 0,
77+
advanced: 0,
78+
intermediate: 0,
79+
beginner: 0,
80+
};
81+
82+
Object.values(SKILL_PROFICIENCY_MAP).forEach((level) => {
83+
stats[level]++;
84+
});
85+
86+
return stats;
87+
}

src/lib/constants/skills.ts

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { SkillCategory, SkillName } from '@/lib/types/skill';
2+
import { getSkillProficiency } from './skill-levels';
23

34
export const SKILL_CATEGORIES: SkillCategory[] = [
45
{
@@ -7,12 +8,12 @@ export const SKILL_CATEGORIES: SkillCategory[] = [
78
icon: '/images/minecraft/item/command_block_minecart.png',
89
confidence: 5,
910
skills: [
10-
{ name: 'Java' as SkillName, proficiency: 'expert', yearsOfExperience: 8 },
11-
{ name: 'Kotlin' as SkillName, proficiency: 'expert', yearsOfExperience: 5 },
12-
{ name: 'TypeScript' as SkillName, proficiency: 'advanced', yearsOfExperience: 3 },
13-
{ name: 'Python' as SkillName, proficiency: 'advanced', yearsOfExperience: 4 },
14-
{ name: 'Spring Boot' as SkillName, proficiency: 'advanced', yearsOfExperience: 4 },
15-
{ name: 'Ktor' as SkillName, proficiency: 'advanced', yearsOfExperience: 3 },
11+
{ name: 'Java' as SkillName, proficiency: getSkillProficiency('Java'), yearsOfExperience: 8 },
12+
{ name: 'Kotlin' as SkillName, proficiency: getSkillProficiency('Kotlin'), yearsOfExperience: 5 },
13+
{ name: 'TypeScript' as SkillName, proficiency: getSkillProficiency('TypeScript'), yearsOfExperience: 3 },
14+
{ name: 'Python' as SkillName, proficiency: getSkillProficiency('Python'), yearsOfExperience: 4 },
15+
{ name: 'Spring Boot' as SkillName, proficiency: getSkillProficiency('Spring Boot'), yearsOfExperience: 4 },
16+
{ name: 'Ktor' as SkillName, proficiency: getSkillProficiency('Ktor'), yearsOfExperience: 3 },
1617
],
1718
order: 1,
1819
},
@@ -22,11 +23,11 @@ export const SKILL_CATEGORIES: SkillCategory[] = [
2223
icon: '/images/minecraft/item/brush.png',
2324
confidence: 4,
2425
skills: [
25-
{ name: 'React' as SkillName, proficiency: 'advanced', yearsOfExperience: 3 },
26-
{ name: 'Vue.js' as SkillName, proficiency: 'advanced', yearsOfExperience: 3 },
27-
{ name: 'TypeScript' as SkillName, proficiency: 'advanced', yearsOfExperience: 3 },
28-
{ name: 'Next.js' as SkillName, proficiency: 'advanced', yearsOfExperience: 2 },
29-
{ name: 'TailwindCSS' as SkillName, proficiency: 'advanced', yearsOfExperience: 2 },
26+
{ name: 'React' as SkillName, proficiency: getSkillProficiency('React'), yearsOfExperience: 3 },
27+
{ name: 'Vue.js' as SkillName, proficiency: getSkillProficiency('Vue.js'), yearsOfExperience: 3 },
28+
{ name: 'TypeScript' as SkillName, proficiency: getSkillProficiency('TypeScript'), yearsOfExperience: 3 },
29+
{ name: 'Next.js' as SkillName, proficiency: getSkillProficiency('Next.js'), yearsOfExperience: 2 },
30+
{ name: 'TailwindCSS' as SkillName, proficiency: getSkillProficiency('TailwindCSS'), yearsOfExperience: 2 },
3031
],
3132
order: 2,
3233
},
@@ -36,12 +37,12 @@ export const SKILL_CATEGORIES: SkillCategory[] = [
3637
icon: '/images/minecraft/item/iron_pickaxe.png',
3738
confidence: 4,
3839
skills: [
39-
{ name: 'Proxmox' as SkillName, proficiency: 'advanced', yearsOfExperience: 4 },
40-
{ name: 'Kubernetes' as SkillName, proficiency: 'intermediate', yearsOfExperience: 2 },
41-
{ name: 'AWS' as SkillName, proficiency: 'intermediate', yearsOfExperience: 2 },
42-
{ name: 'GCP' as SkillName, proficiency: 'intermediate', yearsOfExperience: 2 },
43-
{ name: 'GitHub Actions' as SkillName, proficiency: 'advanced', yearsOfExperience: 3 },
44-
{ name: 'Docker' as SkillName, proficiency: 'advanced', yearsOfExperience: 4 },
40+
{ name: 'Proxmox' as SkillName, proficiency: getSkillProficiency('Proxmox'), yearsOfExperience: 4 },
41+
{ name: 'Kubernetes' as SkillName, proficiency: getSkillProficiency('Kubernetes'), yearsOfExperience: 2 },
42+
{ name: 'AWS' as SkillName, proficiency: getSkillProficiency('AWS'), yearsOfExperience: 2 },
43+
{ name: 'GCP' as SkillName, proficiency: getSkillProficiency('GCP'), yearsOfExperience: 2 },
44+
{ name: 'GitHub Actions' as SkillName, proficiency: getSkillProficiency('GitHub Actions'), yearsOfExperience: 3 },
45+
{ name: 'Docker' as SkillName, proficiency: getSkillProficiency('Docker'), yearsOfExperience: 4 },
4546
],
4647
order: 3,
4748
},
@@ -51,9 +52,9 @@ export const SKILL_CATEGORIES: SkillCategory[] = [
5152
icon: '/images/minecraft/item/chest_minecart.png',
5253
confidence: 4,
5354
skills: [
54-
{ name: 'MySQL/MariaDB' as SkillName, proficiency: 'advanced', yearsOfExperience: 5 },
55-
{ name: 'PostgreSQL' as SkillName, proficiency: 'advanced', yearsOfExperience: 3 },
56-
{ name: 'Redis' as SkillName, proficiency: 'advanced', yearsOfExperience: 3 },
55+
{ name: 'MySQL/MariaDB' as SkillName, proficiency: getSkillProficiency('MySQL/MariaDB'), yearsOfExperience: 5 },
56+
{ name: 'PostgreSQL' as SkillName, proficiency: getSkillProficiency('PostgreSQL'), yearsOfExperience: 3 },
57+
{ name: 'Redis' as SkillName, proficiency: getSkillProficiency('Redis'), yearsOfExperience: 3 },
5758
],
5859
order: 4,
5960
},
@@ -63,12 +64,24 @@ export const SKILL_CATEGORIES: SkillCategory[] = [
6364
icon: '/images/minecraft/item/enchanted_book.png',
6465
confidence: 2,
6566
skills: [
66-
{ name: 'Python' as SkillName, proficiency: 'intermediate', yearsOfExperience: 4 },
67-
{ name: 'LLM Integration' as SkillName, proficiency: 'intermediate', yearsOfExperience: 1 },
68-
{ name: 'Data Analysis' as SkillName, proficiency: 'beginner', yearsOfExperience: 1 },
67+
{ name: 'Python' as SkillName, proficiency: getSkillProficiency('Python'), yearsOfExperience: 4 },
68+
{ name: 'LLM Integration' as SkillName, proficiency: getSkillProficiency('LLM Integration'), yearsOfExperience: 1 },
69+
{ name: 'Data Analysis' as SkillName, proficiency: getSkillProficiency('Data Analysis'), yearsOfExperience: 1 },
6970
],
7071
order: 5,
7172
},
73+
{
74+
id: 'other-technologies',
75+
title: 'Other Technologies',
76+
icon: '/images/minecraft/item/wooden_pickaxe.png',
77+
confidence: 1,
78+
skills: [
79+
{ name: 'Hardware' as SkillName, proficiency: getSkillProficiency('Hardware'), yearsOfExperience: 0.5 },
80+
{ name: 'Tauri' as SkillName, proficiency: getSkillProficiency('Tauri'), yearsOfExperience: 0.5 },
81+
{ name: 'C#' as SkillName, proficiency: getSkillProficiency('C#'), yearsOfExperience: 0.5 },
82+
],
83+
order: 6,
84+
},
7285
];
7386

7487
// Featured skills for Home page - optimized for 3x3 grid

src/lib/types/skill.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@ export type ProficiencyLevel = typeof PROFICIENCY_LEVELS[number];
55
// Skill names with strict type safety
66
export const SKILL_NAMES = [
77
// Backend
8-
'Java', 'Kotlin', 'TypeScript', 'Python', 'Spring Boot', 'Ktor',
8+
'Java', 'Kotlin', 'TypeScript', 'Python', 'Spring Boot', 'Ktor', 'C#',
99
// Frontend
10-
'React', 'Vue.js', 'Next.js', 'TailwindCSS',
10+
'React', 'Vue.js', 'Next.js', 'Nuxt.js', 'TailwindCSS', 'Tauri',
1111
// Infrastructure
1212
'Proxmox', 'Kubernetes', 'Docker', 'AWS', 'GCP', 'GitHub Actions',
1313
// Database
1414
'MySQL/MariaDB', 'PostgreSQL', 'Redis',
1515
// ML/DS
1616
'LLM Integration', 'Data Analysis',
17+
// Hardware
18+
'Hardware',
1719
] as const;
1820
export type SkillName = typeof SKILL_NAMES[number];
1921

0 commit comments

Comments
 (0)