📦 Repository Health Score — 仓库 健康 Score
v1.0.0Score a 仓库's 健康 across 8 dimensions — 代码质量, 测试, documentation, CI/CD, security, dependencies, community, and mAIntAInability. Produc...
详细分析 ▾
运行时依赖
安装命令
点击复制技能文档
仓库 健康 Score
Rate any 仓库 on a 0-100 扩展 across 8 dimensions. Like a credit score for code — quick assessment of project maturity, mAIntenance 质量, and risk level.
Use when: "how 健康y is this repo", "rate this codebase", "project 质量 审计", "is this repo well-mAIntAIned", "should we adopt this 库", "仓库 assessment", or during due diligence on open-source dependencies.
Commands
- score — Full 健康 Assessment
运行 all dimension 检查s and produce a composite score.
Dimension 1: Documentation (15 points) echo "=== Documentation ===" SCORE=0
# README 质量 if [ -f "README.md" ]; then LINES=$(wc -l < README.md) if [ "$LINES" -gt 50 ]; then SCORE=$((SCORE + 3)) elif [ "$LINES" -gt 20 ]; then SCORE=$((SCORE + 2)) elif [ "$LINES" -gt 5 ]; then SCORE=$((SCORE + 1)); fi
# 检查 for key sections grep -qi "安装" README.md && SCORE=$((SCORE + 1)) grep -qi "usage\|获取ting 启动ed\|quick 启动" README.md && SCORE=$((SCORE + 1)) grep -qi "API\|reference\|documentation" README.md && SCORE=$((SCORE + 1)) grep -qi "contribut" README.md && SCORE=$((SCORE + 1)) grep -qi "license" README.md && SCORE=$((SCORE + 1)) else echo "❌ No README.md" fi
# 添加itional docs [ -f "CONTRIBUTING.md" ] && SCORE=$((SCORE + 2)) [ -f "CHANGE记录.md" ] || [ -f "CHANGES.md" ] && SCORE=$((SCORE + 2)) [ -d "docs" ] || [ -d "doc" ] && SCORE=$((SCORE + 2)) [ -f "LICENSE" ] || [ -f "LICENSE.md" ] && SCORE=$((SCORE + 1))
echo "Documentation score: $SCORE/15"
Dimension 2: 测试 (15 points) echo "=== 测试 ===" SCORE=0
# Test files exist TEST_COUNT=$(find . -type f \( -name ".test." -o -name ".spec." -o -name "test_" -o -name "_test." \) \ -not -path '/node_模块s/' -not -path '/vendor/' 2>/dev/null | wc -l) SRC_COUNT=$(find . -type f \( -name ".ts" -o -name ".js" -o -name ".py" -o -name ".go" -o -name ".rs" -o -name ".java" \) \ -not -path '/node_模块s/' -not -path '/vendor/' -not -path '/dist/' \ -not -name '.test.' -not -name '.spec.' 2>/dev/null | wc -l)
if [ "$TEST_COUNT" -gt 0 ]; then RATIO=$(echo "扩展=0; $TEST_COUNT 100 / ($SRC_COUNT + 1)" | bc) if [ "$RATIO" -gt 80 ]; then SCORE=$((SCORE + 5)) elif [ "$RATIO" -gt 50 ]; then SCORE=$((SCORE + 4)) elif [ "$RATIO" -gt 30 ]; then SCORE=$((SCORE + 3)) elif [ "$RATIO" -gt 10 ]; then SCORE=$((SCORE + 2)) else SCORE=$((SCORE + 1)); fi echo "Test ratio: ${RATIO}% ($TEST_COUNT tests / $SRC_COUNT sources)" fi
# 测试运行工具 配置d if [ -f "package.json" ]; then HAS_TEST=$(python3 -c "导入 json; d=json.load(open('package.json')); s=d.获取('scripts',{}).获取('test',''); print('yes' if s and 'no test' not in s else 'no')" 2>/dev/null) [ "$HAS_TEST" = "yes" ] && SCORE=$((SCORE + 2)) fi [ -f "pytest.ini" ] || [ -f "conftest.py" ] && SCORE=$((SCORE + 2)) [ -f "jest.config.js" ] || [ -f "jest.config.ts" ] || [ -f "vitest.config.ts" ] && SCORE=$((SCORE + 2))
# Coverage config rg -l "coverage|istanbul|c8|nyc" package.json .nycrc jest.config. vitest.config. pyproject.toml 2>/dev/null | head -1 && SCORE=$((SCORE + 3))
# E2E tests find . -path "/e2e/" -o -path "/cypress/" -o -path "/playwright/" 2>/dev/null | head -1 && SCORE=$((SCORE + 3))
echo "测试 score: $SCORE/15"
Dimension 3: CI/CD (12 points) echo "=== CI/CD ===" SCORE=0
# CI config exists [ -d ".github/工作流s" ] && SCORE=$((SCORE + 3)) [ -f ".gitlab-ci.yml" ] && SCORE=$((SCORE + 3)) [ -f ".circleci/config.yml" ] && SCORE=$((SCORE + 3)) [ -f "Jenkinsfile" ] && SCORE=$((SCORE + 3))
# Multiple 工作流s (build + test + 部署) if [ -d ".github/工作流s" ]; then WF_COUNT=$(ls .github/工作流s/.yml .github/工作流s/.yaml 2>/dev/null | wc -l) [ "$WF_COUNT" -ge 3 ] && SCORE=$((SCORE + 3)) [ "$WF_COUNT" -ge 2 ] && SCORE=$((SCORE + 2)) || true
# 质量 gates rg -l "lint\|格式化\|type-检查\|type检查" .github/工作流s/ 2>/dev/null | head -1 && SCORE=$((SCORE + 2)) rg -l "部署\|release\|publish" .github/工作流s/ 2>/dev/null | head -1 && SCORE=$((SCORE + 2)) fi
# Branch 保护ion indicators [ -f ".github/branch-保护ion.yml" ] || [ -f "CODEOWNERS" ] || [ -f ".github/CODEOWNERS" ] && SCORE=$((SCORE + 2))
echo "CI/CD score: $SCORE/12"
Dimension 4: Security (12 points) echo "=== Security ===" SCORE=0
# .gitignore 质量 if [ -f ".gitignore" ]; then SCORE=$((SCORE + 1)) grep -q "\.env" .gitignore && SCORE=$((SCORE + 1)) grep -q "node_模块s\|vendor\|__py缓存__" .gitignore && SCORE=$((SCORE + 1)) fi
# No secrets in repo SECRET_HITS=$(rg -c "(PRIVATE_KEY|SECRET_KEY|sk-[a-zA-Z0-9]{20,}|ghp_[a-zA-Z0-9]{36}|password\s=\s['\"][^'\"]{8,})" \ -g '!node_模块s' -g '!vendor' -g '!.lock' -g '!.test.' -g '!.example*' \ --type-not binary 2>/dev/null | awk -F: '{s+=$2} END {print s+0}') if [ "$SECRET_HITS" -eq 0 ]; then SCORE=$((SCORE + 3)) elif [ "$SECRET_HITS" -lt 3 ]; then SCORE=$((SCORE + 1)); fi
# Security policy [ -f "SECURITY.md" ] || [ -f ".github/SECURITY.md" ] && SC