From da798360c7a83819a9711b15c44115c3e4a05b1c Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Wed, 11 Feb 2026 13:23:33 +0900 Subject: [PATCH 1/3] feat: sort contributors by role --- server/api/contributors.get.ts | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/server/api/contributors.get.ts b/server/api/contributors.get.ts index bf9d0fcc2..42126945c 100644 --- a/server/api/contributors.get.ts +++ b/server/api/contributors.get.ts @@ -6,6 +6,24 @@ export interface GitHubContributor { contributions: number } +// TODO: stub - need to fetch list of role members from somewhere to avoid hardcoding ( +type Role = 'stewards' | 'core' | 'maintainers' +const roleMembers: Record = { + stewards: ['danielroe', 'patak-dev'], + core: [], + maintainers: [], +} + +function getRoleOrder(login: GitHubContributor['login']) { + return roleMembers.stewards.includes(login) + ? 0 + : roleMembers.core.includes(login) + ? 1 + : roleMembers.maintainers.includes(login) + ? 2 + : 3 +} + export default defineCachedEventHandler( async (): Promise => { const allContributors: GitHubContributor[] = [] @@ -46,8 +64,14 @@ export default defineCachedEventHandler( page++ } - // Filter out bots - return allContributors.filter(c => !c.login.includes('[bot]')) + return ( + allContributors + // Filter out bots + .filter(c => !c.login.includes('[bot]')) + + // Sort by role (steward > core > maintainer > contributor) + .sort((a, b) => getRoleOrder(a.login) - getRoleOrder(b.login)) + ) }, { maxAge: 3600, // Cache for 1 hour From 9fe1b25eaa203f8d984b437d90bcf846240601c2 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Thu, 12 Feb 2026 01:11:36 +0900 Subject: [PATCH 2/3] feat: set `role` prop to contributor object (+ change member list type to Set) --- server/api/contributors.get.ts | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/server/api/contributors.get.ts b/server/api/contributors.get.ts index 42126945c..819ffa4a3 100644 --- a/server/api/contributors.get.ts +++ b/server/api/contributors.get.ts @@ -4,24 +4,22 @@ export interface GitHubContributor { avatar_url: string html_url: string contributions: number + role: Role } // TODO: stub - need to fetch list of role members from somewhere to avoid hardcoding ( -type Role = 'stewards' | 'core' | 'maintainers' -const roleMembers: Record = { - stewards: ['danielroe', 'patak-dev'], - core: [], - maintainers: [], +type Role = 'stewards' | 'core' | 'maintainers' | 'contributor' +const roleMembers: Record, Set> = { + stewards: new Set(['danielroe', 'patak-dev']), + core: new Set([]), + maintainers: new Set([]), } -function getRoleOrder(login: GitHubContributor['login']) { - return roleMembers.stewards.includes(login) - ? 0 - : roleMembers.core.includes(login) - ? 1 - : roleMembers.maintainers.includes(login) - ? 2 - : 3 +function getRoleInfo(login: string): { role: Role; order: number } { + if (roleMembers.stewards.has(login)) return { role: 'stewards', order: 0 } + if (roleMembers.core.has(login)) return { role: 'core', order: 1 } + if (roleMembers.maintainers.has(login)) return { role: 'maintainers', order: 2 } + return { role: 'contributor', order: 3 } } export default defineCachedEventHandler( @@ -68,9 +66,14 @@ export default defineCachedEventHandler( allContributors // Filter out bots .filter(c => !c.login.includes('[bot]')) - + // Assign role + .map(c => { + const { role, order } = getRoleInfo(c.login) + return Object.assign(c, { role, order }) + }) // Sort by role (steward > core > maintainer > contributor) - .sort((a, b) => getRoleOrder(a.login) - getRoleOrder(b.login)) + .sort((a, b) => a.order - b.order) + .map(({ order: _, ...rest }) => rest) ) }, { From ba9b5c7b20bd128de653f6541d848147191020b4 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Thu, 12 Feb 2026 01:36:59 +0900 Subject: [PATCH 3/3] feat: create governance members section and mini-card stub --- app/pages/about.vue | 48 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/app/pages/about.vue b/app/pages/about.vue index be344b577..bf9f5c16c 100644 --- a/app/pages/about.vue +++ b/app/pages/about.vue @@ -138,7 +138,48 @@ const { data: contributors, status: contributorsStatus } = useLazyFetch('/api/co
-

+

Team

+

+ {{ $t('about.contributors.description') }} +

+ + +
+

Governance

+

+ TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. +

+ +
+ + +
+
@{{ person.login }}
+
{{ person.role }}
+
+
+ TODO: add other maintainers +
+
+ +

{{ $t( 'about.contributors.title', @@ -146,9 +187,10 @@ const { data: contributors, status: contributorsStatus } = useLazyFetch('/api/co contributors?.length ?? 0, ) }} -

+

- {{ $t('about.contributors.description') }} + TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua.