使用四维度框架评估任意 GitLab MR 或 GitHub PR 的复杂度:规模(20%),认知负荷(30%),审查工作量(30%),风险/影响(20%)...
MR / PR 复杂计分器.是一项面向实际任务的技能,主要用于A 用于合并请求( GitLab) 和 Pull 请求( GitHub) 的提供- 不可知复杂计分引擎. 构建于 4- dimension 框架, 以捕捉“ 复杂” 行为。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
一个与平台无关的合并请求(GitLab MR)和拉取请求(GitHub PR)复杂度评分引擎。基于四维框架构建,精准刻画代码评审中“复杂”的真实含义——而不仅限于变更行数。
| 维度 | 权重 | 衡量内容 |
|---|---|---|
| Size(规模) | 20% | 代码变更量(对数尺度——大型 PR 会快速趋于饱和) |
| Cognitive Load(认知负荷) | 30% | 目录广度、跨模块变更、文件类型多样性 |
| Review Effort(评审投入) | 30% | 讨论深度、评审人数量、审批迭代次数 |
| Risk / Impact(风险 / 影响) | 20% | 破坏性变更、迁移任务、安全标签、依赖项变更 |
输出等级: trivial / simple / moderate / complex / highly_complex
# 评分一个 GitHub PR(基础模式 —— 仅传入 PR 对象)
curl -s "https://api.github.com/repos/OWNER/REPO/pulls/NUMBER"
-H "Authorization: Bearer $GITHUB_TOKEN"
| python score_mr.py --provider github
# 评分一个 GitLab MR(含 diff 统计信息)
curl -s "https://gitlab.com/api/v4/projects/PROJECT_ID/merge_requests/IID?include_diff_stats=true"
-H "PRIVATE-TOKEN: $GITLAB_TOKEN"
| python score_mr.py --provider gitlab
# 更丰富的评分 —— 同时获取文件列表 + 评审记录
curl -s ".../pulls/NUMBER" > pr.json
curl -s ".../pulls/NUMBER/files" > files.json
curl -s ".../pulls/NUMBER/reviews" > reviews.json
python score_mr.py --provider github --pr pr.json --files files.json --reviews reviews.json
{
"provider": "github",
"id": 412,
"title": "Migrate auth service to OAuth2",
"score": {
"total": 74.2,
"tier": "complex",
"size": 68.0,
"cognitive": 81.5,
"review_effort": 72.0,
"risk_impact": 60.0
},
"summary": "High mental load: 14 files across 6 directories, 3 reviewers involved",
"tier_insight": "Needs careful review — high cognitive load and cross-module impact.",
"stats": {
"additions": 412,
"deletions": 87,
"files_changed": 14,
"reviewers": 3,
"discussions": 9,
"net_lines": 325
}
}
mr-complexity-scorer/
SKILL.md # 本文件
mr_complexity_service.py # 核心四维评分引擎(纯 Python 实现)
score_mr.py # CLI 工具:接收 API 返回的 JSON 输入,输出复杂度 JSON
requirements.txt # 无外部依赖 —— 仅使用标准库,支持 Python 3.9+
adapters/
gitlab_adapter.py # 将 GitLab MR API 字典映射为 MRData
github_adapter.py # 将 GitHub PR API 字典映射为 MRData
from mr_complexity_service import MRComplexityCalculator, MRData
from adapters.github_adapter import github_pr_to_mrdata
# 从 GitHub PR 字典(来自 API 或 webhook payload)构建 MRData
mr_data = github_pr_to_mrdata(
pr=pr_dict,
files=files_list, # 可选:/pulls/:number/files
commits=commits_list, # 可选:/pulls/:number/commits
reviews=reviews_list, # 可选:/pulls/:number/reviews
)
calculator = MRComplexityCalculator()
result = calculator.calculate(mr_data)
print(result.complexity_tier) # "complex"
print(result.total_score) # 74.2
print(result.human_summary) # "High mental load: ..."
| 额外 API 调用 | 解锁能力 | 是否推荐? |
|---|---|---|
/pulls/:n/files |
基于文件路径的认知负荷分析 | 是,始终推荐 |
/pulls/:n/reviews |
准确的评审人数量与审批轮次统计 | 评审维度必需 |
/pulls/:n/commits |
破坏性变更检测 | 建议获取(Nice to have) |
/pulls/:n/comments |
内联讨论数量统计 | 可选 |
即使不进行数据增强,评分器仍可正常工作——它会使用基础 PR 对象中的 changed_files、review_comments 和 requested_reviewers 字段。增强数据可显著提升评分准确性。
只需实现一个轻量适配器,将目标平台的 MR/PR 字典映射为 MRData 类型即可:
from mr_complexity_service import MRData
def linear_issue_to_mrdata(issue: dict) -> MRData:
return MRData(
iid=issue["number"],
title=issue["title"],
# ... 映射其余字段
)
已验证兼容:GitLab、GitHub、Gitea、Bitbucket、Azure DevOps —— 任何提供 MR/PR 元数据的平台均可支持。
from mr_complexity_service import MRComplexityCalculator, ComplexityConfig
config = ComplexityConfig(
weight_size=0.15,
weight_cognitive=0.35,
weight_review=0.30,
weight_risk=0.20,
)
calculator = MRComplexityCalculator(config=config)