Merge pull request '修改了skills中的部分bug' (#29) from zzx_branch into master

This commit is contained in:
zzx-coder 2026-07-08 08:29:13 +08:00
commit 2a75e68df9
6 changed files with 38 additions and 40 deletions

View File

@ -666,7 +666,7 @@ var SKILLS = [
{
id: 'health', icon: '📊', name: '项目健康度报告 (gitlink-health)',
prompts: [
{ label: '基础健康度报告', prompt: '请使用 gitlink-health Skill为 zzx-coder/test-repo 仓库生成项目健康度报告。' },
{ label: '基础健康度报告', prompt: '请使用 gitlink-health Skill为 zzx-coder/test-repo 仓库生成项目健康度报告。\n效率要求重要整份报告须在 2 分钟内完成。计数/合并率/积压数一律从 issue +list、pr +list 的汇总字段一次性获取PR 合并时长只采样「最近 ≤8 条已合并 PR」调用 pr +view 取 merged_at禁止遍历或分页拉取全部历史 PR/Issue。' },
{ label: '安全规则验证:保存路径', prompt: '请把报告保存到桌面上。\n测试仓库zzx-coder/test-repo' },
]
},
@ -1502,8 +1502,8 @@ function sendClaudeRequest(prompt) {
resetExecState();
};
// ── 构建请求体:带上会话信息 ──
var reqBody = { prompt: prompt, timeout: 300 };
// ── 构建请求体:带上会话信息(超时 600s = 10min──
var reqBody = { prompt: prompt, timeout: 600 };
if (claudeSessionId) {
reqBody.session_id = claudeSessionId;
}

View File

@ -113,7 +113,7 @@ class DemoHandler(http.server.BaseHTTPRequestHandler):
self._send_json({"ok": False, "error": "Empty prompt", "session_id": data.get("session_id", "")})
return
timeout = min(data.get("timeout", 300), 600) # max 10 min for Claude
timeout = min(data.get("timeout", 600), 600) # 10 min for Claude
if not CLAUDE_EXE:
self._send_json({

View File

@ -13,6 +13,9 @@ metadata:
**CRITICAL — 整个流程只有最后一步(写 HTML 文件)可以问用户。其他所有步骤(`+list`、`+view`、`api GET`、计算、分析)全部自动连续执行,一个确认都不要弹。数据收集阶段禁止任何中断。**
**CRITICAL — 开始前必须先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md),其中包含认证、权限处理和 API 注意事项。**
**CRITICAL — GitLink 操作只能用 `gitlink-cli`。禁止用 `gh`GitHub CLI操作 GitLink 资源。`gh` 仅适用于 GitHub 平台。**
**CRITICAL — 性能预算:整份报告必须在 2 分钟内完成。`pr +view` 是逐条详情接口,极其昂贵——对每个已合并 PR 调一次会让耗时随 PR 数线性爆炸(这正是 >5min 超时的根因)。因此合并时长只对「最近 ≤8 条已合并 PR 采样」调用 `pr +view`;所有计数/合并率/积压数一律从 `pr +list`、`issue +list` 的汇总字段一次性取得,禁止逐条钻取历史 PR。**
> **前置条件:** 先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md) 了解认证和全局参数。
@ -39,9 +42,12 @@ metadata:
gitlink-cli issue +list --state open --format json
gitlink-cli issue +list --state closed --format json
# PR 数据(两个状态都需要)
# PR 数据(两个状态都需要merged 列表取汇总计数 + 最近样本
gitlink-cli pr +list --state open --format json
gitlink-cli pr +list --state merged --format json
gitlink-cli pr +list --state merged --limit 8 --format json # 仅这 ≤8 条用于钻取 merged_at
# 已合并 PR 的合并时间(仅对上面取到的 ≤8 条样本逐条调用,切勿扩大)
gitlink-cli pr +view --id <pull_request_number> --format json # 取 data.pull_request.merged_at
# 贡献者统计Raw API
gitlink-cli api GET /:owner/:repo/contributors --format json
@ -99,6 +105,7 @@ PR 合并效率由**三类 PR** 共同决定,需计算**三段时间**
| 开放中status=0 | ② | ❌ | ✅ |
> **数据获取**`merged_at` 仅在 `pr +view --id <pull_request_number>` 单个 PR 详情中返回(路径 `data.pull_request.merged_at`),列表接口不暴露。
> **效率关键(采样而非全量)**:合并时长是统计量,只需对**最近 ≤8 条已合并 PR**调用 `pr +view``merged_at` 求平均即可——`pr +list --state merged` 默认按合并时间倒序,列表前 ≤8 条即为最近样本。合并总数 / 合并率 / 积压数等计数指标全部从 `pr +list` 的汇总字段一次性获取,**禁止**对全部历史已合并 PR 逐条调用 `pr +view`(会超时)。
> **绝对禁止**:用「当前时间 - 创建时间」估算已合并 PR 的合并时间。开放 PR 用此公式是允许的(且必要),因为它们没有合并时间点,等待时长反映积压。
### 3. 贡献者活跃度

View File

@ -24,19 +24,20 @@ gitlink-cli issue +list --state closed --format json
### 第二步:收集 PR 数据
```bash
# 获取未合并 PR
# 获取未合并 PR(计数 + 积压)
gitlink-cli pr +list --state open --format json
# 获取已合并 PR
gitlink-cli pr +list --state merged --format json
# 获取已合并 PR 汇总 + 最近样本(--limit 8 限定钻取范围,避免超时)
gitlink-cli pr +list --state merged --limit 8 --format json
# 仅对上面取到的 ≤8 条样本逐条取 merged_at切勿对全部历史 PR 调用)
gitlink-cli pr +view --id <pull_request_number> --format json
```
# AI 从返回中提取:
# - merged count: 10
# - open count: 0
# - 合并率: 10/11 = 91%
# - 最新合并 PR: #11 (2026-06-04)
# - PR 平均合并时间需逐条计算
```
# - merged count / open count从 pr +list 汇总字段
# - 合并率: merged / (merged + closed)
# - 已合并 PR 平均合并时长:仅基于这 ≤8 条样本的 merged_at - created_at 求平均
### 第三步:收集贡献者统计
@ -90,7 +91,7 @@ AI 读取 `skills/gitlink-health/template.html`,将计算后的指标替换所
## AI Agent 执行要点
1. **数据收集顺序**:先收集 Issue 和 PRShortcut 命令),再收集 contributorsRaw API避免一次性大量 API 调用
2. **分页处理**Issue 和 PR 数量超过单页限制时,用 `--page` 逐页获取
2. **效率优先于全量**:报告是趋势快照,不是审计。计数/合并率从 `+list` 汇总字段一次取得;合并时长只采样最近 ≤8 条已合并 PR`pr +view`)。**禁止**分页遍历全部历史 Issue/PR也禁止对每个已合并 PR 都调 `pr +view`——这是 >5min 超时的根因
3. **时间计算**ISO 8601 格式解析优先Unix 时间戳更可靠但 PR 的 `pr_created_unix` 仅部分返回
4. **指标计算容错**:样本不足时标注而非报错,新项目可能仅有少量数据
5. **评分可按需调整**:新项目无 Release 时,"无近期发布"项自动跳过

View File

@ -43,14 +43,16 @@ PR 返回的关键字段:
| 字段 | 用途 |
|------|------|
| `pull_request_number` | PR 编号 |
| `pull_request_number` | PR 编号(用于 `pr +view --id` 钻取) |
| `name` (title) | PR 标题 |
| `pull_request_status` | 状态0=open, 1=merged, 2=closed |
| `author_login` | 作者 |
| `pr_full_time` | 创建时间 (ISO 8601) |
| `pr_merged_at` | 合并时间 |
| `pr_created_unix` | 创建时间 (Unix timestamp) |
| `merged_issues_size` / `open_count` / `close_count` | 合并/开放/关闭未合并计数(汇总字段,与 `--limit` 无关,一次性取得) |
> ⚠️ `pr +list` **不返回** `merged_at`(合并时间)字段,只有创建时间。`merged_at` 仅在 `pr +view --id <pull_request_number>``data.pull_request.merged_at` 中暴露。
> ⚠️ **为控制耗时,只对最近 ≤8 条已合并 PR 调用 `pr +view` 取 `merged_at`**(列表默认按合并时间倒序,前 ≤8 条即最近样本)。`pr +list --state merged --limit 8` 一条命令即可同时拿到汇总计数(`merged_issues_size` 等不受 limit 影响)和 8 条样本。禁止遍历全部历史已合并 PR。
> ⚠️ `--state` 参数仅影响 `merged_count`/`open_count`/`closed_count` 汇总计数API 返回的 issues 列表可能包含所有状态的 PR。需按 `pull_request_status` 客户端过滤。
### 步骤 3收集贡献者统计
@ -100,17 +102,17 @@ gitlink-cli api GET /:owner/:repo/activity --format json
数据收集覆盖以下时间范围:
- **Issue**: 所有未关闭 + 近期已关闭(默认取最近 100 条
- **PR**: 所有未合并 + 近期已合并(默认取最近 100 条
- **Issue**: 所有未关闭 + 近期已关闭(计数从汇总字段取;时间计算用近期限定条数即可
- **PR**: 所有未合并 + 近期已合并(计数/合并率从 `pr +list` 汇总字段取;**合并时长仅采样最近 ≤8 条已合并 PR** 钻取 `merged_at`
- **Contributors**: 项目全量历史数据
- **Activity**: 最近 30 天
对于大型项目,可通过 `--page` 分页获取更多数据
大型项目也**不要**通过 `--page` 分页遍历全部历史数据——健康度是趋势快照,计数取汇总字段、合并时长取最近 ≤8 条样本即可,避免超时
## 注意事项
- 计算响应时间需要 Issue 有 `closed_at` 字段,仅已关闭 Issue 才会返回此字段
- PR 合并时间需通过 `pr_full_time` 与当前时间对比估算,或结合 PM `/weekly_issues` API
- PR 合并时间**不能**用「当前时间 - `pr_full_time`」估算(已合并 PR 必须取真实 `merged_at``merged_at` 通过 `pr +view --id` 获取,**仅采样最近 ≤8 条已合并 PR**
- `contributors` 端点统计基于默认分支(通常为 `master`),不含其他分支
- `--owner` / `--repo` 在仓库目录下可自动解析
- 时间计算使用 Unix 时间戳(`pr_created_unix`)比解析字符串格式(`pr_full_time`)更可靠

View File

@ -73,9 +73,9 @@ PR 合并效率由**三类 PR** 共同决定,需计算**三段时间**
### 计算公式
```
# ① 已合并 PR 平均合并时长
# ① 已合并 PR 平均合并时长(基于最近 ≤8 条样本)
time_merged_i = merged_at_i - created_at_i
avg_merged = sum(time_merged_i) / merged_count
avg_merged = sum(time_merged_i) / sample_count # sample_count = 实际采样的 PR 条数≤8不是历史合并总数
# ② 开放 PR 平均等待时长
time_open_i = now - created_at_i
@ -123,28 +123,16 @@ merge_rate = merged_count / (merged_count + closed_count) × 100%
### 数据可用性
| 字段 | 来源命令 | 路径 |
|------|---------|------|
| `created_at` | `pr +list` | `data.issues[].pr_full_time``pr_created_unix` |
| `merged_at` | `pr +view --id <pull_request_number>` | `data.pull_request.merged_at` |
> **绝对禁止**:用「当前时间 - 创建时间」估算已合并 PR 的合并时间。已合并 PR 必须用真实的 `merged_at`
> 开放 PR 用「当前时间 - 创建时间」是允许的(且必要),因为它们没有合并时间点,等待时长反映积压。
### 数据可用性
PR 合并时间**只与 PR 自身时间相关**(创建时间 + 合并时间),**与当前时间无关**。
实际数据源:
| 字段 | 来源命令 | 路径 |
|------|---------|------|
| `created_at` | `pr +list --state merged` | `data.issues[].pr_full_time``pr_created_unix` |
| `merged_at` | `pr +view --id <pull_request_id>` | `data.pull_request.merged_at` |
| 合并总数 / 合并率 / 积压数 | `pr +list` 汇总字段 | `data.close_count` 等(一次性获取,勿逐条钻取) |
| `merged_at` | `pr +view --id <pull_request_number>` | `data.pull_request.merged_at` |
**注意**`merged_at` 只在 `pr +view` 单个 PR 详情中暴露,列表接口不返回。需要对每个已合并 PR 调用一次详情接口。
> **绝对禁止**:使用「当前时间 - 创建时间」作为合并时间估算。这种做法会把开放中或近期合并的 PR 误判为"超长合并时间",与 PR 合并效率的真实含义相悖。
> **效率关键(采样而非全量)**`merged_at` 只在 `pr +view` 单个 PR 详情中暴露,列表接口不返回。但合并时长是统计量——**只对最近 ≤8 条已合并 PR 采样调用 `pr +view`** 即可求得稳定平均,无需遍历全部历史 PR。`pr +list --state merged` 默认按合并时间倒序,取列表前 ≤8 条作为样本。合并总数/合并率从 `pr +list` 汇总字段一次性取得。
> **绝对禁止**:使用「当前时间 - 创建时间」作为已合并 PR 的合并时间估算(会把开放中或近期合并的 PR 误判为"超长合并时间")。开放 PR 用「当前时间 - 创建时间」是允许且必要的,等待时长反映积压。
## 指标 3贡献者活跃度