多くの開発者が悩むOSS選定を、「スター数」という単一指標の呪縛から解放します。このツールは、プロジェクトの活動量やコミュニティの健全性といった、見えにくい「持続可能性」を可視化する点が新規的です。最大の違いは、ユーザーが「安定性」と「成長性」の重みをスライダーで調整し、自分だけの評価基準を作れること。画一的なランキングではなく、納得感のある意思決定を支援します。技術的には、Geminiによる定性分析を活用し、Issueの雰囲気やドキュメントの質といった、数値化しにくい要素をスコアに反映させている点が特徴です。
OSS健康診断スコアボード
OSSの健全性を多角的に採点し自分好みに評価
GitHubリポジトリのURLを入力すると、活動量やドキュメント品質、コミュニティ健全性といった複数の軸でOSSの持続可能性を採点します。ユーザーは評価の重み付けを調整し、総合スコアをインタラクティブに確認できます。
今後は、現状は単一リポジトリの評価のみですが、将来的には複数リポジトリを並べて比較し、自分の価値基準でソートできる機能を追加したいです。また、評価指標もより精緻化し、技術スタックの陳腐化リスクなども含めることで、技術選定における「かかりつけ医」のような存在を目指したいです。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
OSSの健全性を多角的に評価し、自分好みに重み付けを調整して確認するプロダクトです。
GitHubリポジトリURLの指定
ユーザーは評価したいGitHubリポジトリのURLを入力します。例えば「https://github.com/example/cool-lib」のような形式で指定します。
リポジトリ情報の収集
指定されたGitHubリポジトリから、スター数、コミット数、Issueタイトルなどの生データが収集される設計です。このデモでは、事前に記録されたサンプルデータが使用されます。
AIによる健全性分析
収集された生データに基づき、Geminiがリポジトリの健全性を分析します。ドキュメントの明瞭さ、コミュニティの健全性、バスファクターリスクなどの観点から評価し、JSON形式で分析結果を出力する設計です。例えば、コミュニティ健全性は「helpful」と評価されます。
総合スコアと根拠の生成
生データとAI分析結果を基に、活動量、ドキュメント、コミュニティなどの項目別スコアが算出されます。各スコアには「月間平均コミット数: 45」のような具体的な根拠が添えられます。
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
「Issueの雰囲気」や「ドキュメントの質」をGeminiで定性分析しスコア化する点について、判断の根拠となる具体的な評価基準と、その客観性担保の仕組みは明確にしておくべきでしょう。主観的な評価がスコアに与える影響は、ユーザーの信頼性に直結する可能性があります。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
コードプレビュー
'use client';
import React, { useState, useEffect } from 'react';
import { sampleTrace, FinalOutput } from '../data/sample-trace'; // Import FinalOutput which contains scorecards array
// NOTE: This page does NOT import from source/core. All types are redeclared here.
// Re-declare Scorecard type to match the new structure (array of scorecards)
type Scorecard = {
id: string;
githubUrl: string;
name: string;
overallScore?: number; // Optional, as it's calculated dynamically
scores: {
readiness: number;
activity: number;
community: number;
documentation: number;
busFactor: number;
};
evidence: {
readiness: string[];
activity: string[];
community: string[];
documentation: string[];
busFactor: string[];
};
};
type DisplayResult = {
step: string;
output: any;
};
const pipelineSteps = [
'1. リポジトリデータ取得',
'2. リポジトリ分析 (Gemini)',
'3. スコア計算',
];
// Helper to draw a radar chart point
const getPoint = (angle: number, value: number, radius: number, centerX: number, centerY: number) => {
const x = centerX + value * Math.cos(angle);
const y = centerY + value * Math.sin(angle);
return `${x},${y}`;
};
// Radar Chart Component
const RadarChart = ({ scorecards, weight, calculateWeightedScore }: { scorecards: Scorecard[]; weight: number; calculateWeightedScore: (s: Scorecard, w: number) => number }) => {
const size = 300;
const centerX = size / 2;
const centerY = size / 2;
const radius = size / 2 * 0.8; // Max radius for scores
const numAxes = 5;
const angleStep = (2 * Math.PI) / numAxes;
const scoreLab
...