feat(skills): 新增 3 个 Agent Skill — wiki-builder, pipeline-guardian, webhook-sentinel

新增 Skill:
- gitlink-wiki-builder: Wiki 文档自动化,填补 9 个 wiki CLI 命令的 Skill 空白
- gitlink-pipeline-guardian: 流水线健康监控、故障分析和性能优化
- gitlink-webhook-sentinel: Webhook 投递监控、故障诊断和安全审计

每个 Skill 包含 SKILL.md + examples/,已在 Claude Code 中验证通过。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
whale 2026-06-08 12:01:48 +08:00
parent 7947d4dfd6
commit f1dd01bebc
6 changed files with 2093 additions and 0 deletions

View File

@ -0,0 +1,373 @@
---
name: gitlink-pipeline-guardian
version: 1.0.0
description: "流水线健康守护:监控 CI/CD 流水线状态、分析失败模式、识别慢速构建、生成健康度评分报告。当用户需要排查流水线故障或优化构建效率时触发。"
metadata:
requires:
bins: ["gitlink-cli"]
cliHelp: "gitlink-cli pipeline --help"
---
# gitlink-pipeline-guardian流水线健康守护
**CRITICAL — 开始前必须先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md),其中包含认证、权限处理和 API 注意事项。**
**CRITICAL — 本 Skill 为只读巡检与分析工具。涉及 pipeline 的启用/禁用/删除/运行操作,需经用户确认后方可执行。**
**CRITICAL — GitLink 操作只能用 `gitlink-cli`。禁止用 `gh`GitHub CLI操作 GitLink 资源。`gh` 仅适用于 GitHub 平台。**
> **前置条件:** 先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md) 了解认证和全局参数。
---
## 定位与产物
面向项目维护者的流水线健康守护工具,核心能力:
1. **流水线健康巡检** — 全面扫描流水线运行状态,生成 0-100 健康度评分报告
2. **故障根因分析** — 针对失败构建深入分析日志,定位错误模式并给出修复建议
3. **性能优化分析** — 分析构建耗时分布,识别瓶颈阶段并提出优化方案
4. **流水线配置审计** — 审计流水线配置规范性,推荐最佳实践
`gitlink-ci-health`(关注 CI/CD 基础设施层,使用 `ci +builds`)不同,本 Skill 关注的是**流水线工作流层面**Pipeline使用 `pipeline +runs`、`pipeline +logs`、`pipeline +results` 等命令,覆盖从构建编排到执行结果的完整链路。
### 命令矩阵
| 命令 | 用途 | 涉及工作流 |
|------|------|-----------|
| `pipeline +list` | 列出平台流水线 | 巡检、配置审计 |
| `pipeline +runs` | 列出流水线运行记录 | 巡检、故障分析、性能分析 |
| `pipeline +view` | 查看流水线详情 | 巡检、配置审计 |
| `pipeline +logs` | 查询流水线运行日志 | 故障分析 |
| `pipeline +results` | 查看流水线运行结果 | 巡检、故障分析、性能分析 |
| `ci +builds` | 查看 CI 构建列表 | 巡检(补充) |
| `ci +log` | 查看 CI 构建日志 | 故障分析(补充) |
| `ci +restart` | 重启 CI 构建 | 故障修复(需确认) |
---
## 工作流 1流水线健康巡检
**触发场景**:用户说"流水线怎么样""Pipeline 健康度""流水线报告""构建状态一览"。
### Step 1获取流水线列表
```bash
gitlink-cli pipeline +list --owner-id <owner_id> --page 1 --limit 20 --format json
```
记录所有流水线的 `id`、`name`、`status`。
### Step 2获取近期运行记录
对每个流水线获取运行历史:
```bash
gitlink-cli pipeline +runs --owner <owner> --repo <repo> --ref master --format json
```
提取每次运行的:
- `status` — 运行状态success / failure / running / pending / cancelled
- `started_at` / `finished_at` — 时间信息
- `duration` — 耗时
- `workflow` — 触发的工作流文件
- `branch` / `ref` — 触发分支
### Step 3获取运行结果详情
对最近的关键运行获取结果:
```bash
gitlink-cli pipeline +results --owner <owner> --repo <repo> --run-id <run_id> --format json
```
### Step 4计算健康度评分
按以下评分模板计算总分(满分 100
#### 健康度评分模板
| 维度 | 权重 | 满分 | 评分标准 |
|------|------|------|----------|
| **可用性** | — | 20 | 流水线全部可用=20部分禁用按比例扣分全部不可用=0 |
| **成功率** | — | 25 | ≥95%=25≥90%=22≥80%=18≥70%=12≥60%=8<60%=4无数据=0 |
| **稳定性** | — | 20 | 近10次全部成功=208-9次=166-7次=124-5次=8<4次=4 |
| **性能** | — | 15 | 平均耗时 ≤2min=15≤5min=12≤10min=9≤20min=6>20min=3 |
| **频率** | — | 10 | 每天有构建=102-3天=8每周=5更少=2无运行=0 |
| **规范性** | — | 10 | 有命名规范=3有失败通知=3有缓存策略=2有并行配置=2无=0 |
**总评分级**
| 分数范围 | 等级 | 状态 |
|----------|------|------|
| 90-100 | A | 健康 |
| 75-89 | B | 良好 |
| 60-74 | C | 需关注 |
| 40-59 | D | 需改进 |
| 0-39 | F | 严重 |
### Step 5生成健康巡检报告
按输出模板(见文末)生成报告。
---
## 工作流 2故障根因分析
**触发场景**:用户说"这个构建为什么失败""流水线报错了""帮我排查一下 pipeline 失败"。
### Step 1定位失败运行
```bash
# 获取近期运行,找到状态为 failure 的记录
gitlink-cli pipeline +runs --owner <owner> --repo <repo> --format json
```
### Step 2获取运行结果
```bash
gitlink-cli pipeline +results --owner <owner> --repo <repo> --run-id <failed_run_id> --format json
```
确定失败的阶段stage和步骤step
### Step 3获取失败日志
```bash
gitlink-cli pipeline +logs --owner <owner> --repo <repo> --run-id <failed_run_id> --id <pipeline_id> --index <job_index> --format json
```
> **注意**`pipeline +logs` 需要提供 `--run-id`、`--id`(流水线 ID`--index`(作业索引)。先通过 `pipeline +results` 获取这些参数。
### Step 4补充 CI 日志(如需要)
```bash
gitlink-cli ci +builds --owner <owner> --repo <repo> --format json
gitlink-cli ci +log --build <build_id> --format json
```
### Step 5分析错误模式
将日志中的错误信息与**常见失败模式目录**(见文末)匹配,定位根因。
### Step 6输出分析报告
包含:
- 失败构建基本信息ID、分支、时间
- 错误日志关键片段
- 匹配的失败模式
- 根因分析结论
- 修复建议(具体的代码或配置修改方案)
---
## 工作流 3性能优化分析
**触发场景**:用户说"构建太慢了""优化一下流水线""构建耗时分析"。
### Step 1收集运行耗时数据
```bash
gitlink-cli pipeline +runs --owner <owner> --repo <repo> --format json
```
提取每次运行的 `duration`,计算:
- 平均耗时
- 中位数耗时
- 最大 / 最小耗时
- P90 / P95 耗时
### Step 2获取各阶段结果
对多次运行获取结果,对比各阶段耗时:
```bash
gitlink-cli pipeline +results --owner <owner> --repo <repo> --run-id <run_id> --format json
```
### Step 3识别瓶颈阶段
按阶段统计平均耗时,找出耗时最长的 TOP 3 阶段。
### Step 4慢速构建分析
识别超过平均耗时 1.5 倍的构建,分析可能的慢速原因:
- 依赖安装阶段过长 → 未使用缓存
- 测试阶段过长 → 未并行执行
- 构建阶段过长 → 未增量构建
- 部署阶段过长 → 资源不足
### Step 5输出优化建议
包含:
- 当前耗时统计(表格)
- 瓶颈阶段排名
- 慢速构建列表及原因
- 具体优化建议(带预期收益估算)
---
## 工作流 4流水线配置审计
**触发场景**:用户说"流水线配置合不合理""审计一下 pipeline""流水线最佳实践检查"。
### Step 1获取流水线详情
```bash
gitlink-cli pipeline +list --owner-id <owner_id> --format json
```
对每个流水线:
```bash
gitlink-cli pipeline +view --owner <owner> --repo <repo> --id <pipeline_id> --format json
```
### Step 2审计检查清单
逐项检查以下配置规范:
| 检查项 | 审计标准 | 状态 |
|--------|----------|------|
| **命名规范** | 流水线名称清晰、有业务含义 | 通过/不通过 |
| **触发条件** | 配置了合理的触发分支和事件 | 通过/不通过 |
| **超时设置** | 各阶段设置了合理的超时时间 | 通过/不通过 |
| **重试策略** | 关键阶段配置了重试 | 通过/不通过 |
| **缓存配置** | 依赖安装阶段使用了缓存 | 通过/不通过 |
| **并行执行** | 无依赖的阶段配置了并行 | 通过/不通过 |
| **通知配置** | 配置了失败通知机制 | 通过/不通过 |
| **环境变量** | 敏感信息通过 Secret 管理 | 通过/不通过 |
| **版本锁定** | 依赖版本已锁定(非 latest | 通过/不通过 |
| **清理策略** | 配置了构建产物清理 | 通过/不通过 |
### Step 3生成审计报告
按检查清单生成报告,标注通过率和不通过项的改进建议。
---
## 常见失败模式目录
以下为流水线构建中的常见失败模式,用于故障根因分析时的模式匹配。
### 编译/构建错误
| 模式 ID | 模式名称 | 关键特征 | 常见原因 |
|---------|----------|----------|----------|
| F-COMP-001 | 依赖下载失败 | `npm ERR!`、`Could not resolve`、`download failed` | 网络问题、私有源不可达、版本不存在 |
| F-COMP-002 | 编译语法错误 | `SyntaxError`、`compilation error`、`parse error` | 代码语法问题、语言版本不兼容 |
| F-COMP-003 | 内存不足 | `OOM`、`out of memory`、`heap`、`137 exit code` | 构建资源不足、内存泄漏 |
| F-COMP-004 | 磁盘空间不足 | `No space left`、`ENOSPC`、`disk full` | 构建缓存堆积、产物过大 |
| F-COMP-005 | 版本不兼容 | `version mismatch`、`incompatible`、`unsupported version` | 运行时版本与代码不匹配 |
### 测试错误
| 模式 ID | 模式名称 | 关键特征 | 常见原因 |
|---------|----------|----------|----------|
| F-TEST-001 | 单元测试失败 | `FAIL`、`AssertionError`、`expected but got` | 代码逻辑错误、测试用例过时 |
| F-TEST-002 | 集成测试失败 | `connection refused`、`timeout`、`ECONNREFUSED` | 服务依赖不可用、环境配置错误 |
| F-TEST-003 | 测试超时 | `timeout`、`exceeded`、`Deadline exceeded` | 测试死锁、外部依赖响应慢 |
| F-TEST-004 | 测试覆盖率不达标 | `coverage`、`threshold`、`below` | 代码缺少测试覆盖 |
### 环境/配置错误
| 模式 ID | 模式名称 | 关键特征 | 常见原因 |
|---------|----------|----------|----------|
| F-ENV-001 | 环境变量缺失 | `undefined`、`not set`、`missing env` | Secret 未配置、变量名拼写错误 |
| F-ENV-002 | 权限不足 | `permission denied`、`403`、`unauthorized` | 凭证过期、角色权限不足 |
| F-ENV-003 | Docker 构建失败 | `Dockerfile`、`image not found`、`build failed` | 基础镜像不存在、Dockerfile 语法错误 |
| F-ENV-004 | 资源限制 | `rate limit`、`too many requests`、`429` | API 调用频率超限 |
### 部署错误
| 模式 ID | 模式名称 | 关键特征 | 常见原因 |
|---------|----------|----------|----------|
| F-DEPLOY-001 | 部署超时 | `deployment timeout`、`rollout stuck` | 镜像拉取慢、资源不足 |
| F-DEPLOY-002 | 部署验证失败 | `health check failed`、`unhealthy` | 应用启动失败、配置错误 |
| F-DEPLOY-003 | 回滚触发 | `rollback`、`reverted` | 部署后检测到故障自动回滚 |
---
## 输出模板:流水线健康巡检报告
```markdown
# 流水线健康巡检报告:{{仓库名}}
> 巡检时间:{{当前时间}}
> 仓库:{{full_name}}
> 流水线数量:{{pipeline_count}}
---
## 一、健康度总览
| 指标 | 数值 | 评分 |
|------|------|------|
| 可用性 | {{可用流水线}}/{{总数}} | {{availability_score}}/20 |
| 成功率 | {{success_rate}}%{{success_count}}/{{total_count}} | {{success_score}}/25 |
| 稳定性 | 近 10 次 {{recent_success}} 次成功 | {{stability_score}}/20 |
| 性能 | 平均耗时 {{avg_duration}} | {{performance_score}}/15 |
| 频率 | {{frequency_desc}} | {{frequency_score}}/10 |
| 规范性 | 通过 {{passed_checks}}/{{total_checks}} 项 | {{compliance_score}}/10 |
| **总分** | | **{{total_score}}/100等级 {{grade}}** |
## 二、运行趋势
最近 20 次运行状态:
{{status_bar}}
S=成功 F=失败 R=运行中 -=待执行 C=已取消)
| 时间段 | 总运行 | 成功 | 失败 | 成功率 |
|--------|--------|------|------|--------|
| 最近 7 天 | {{w1_total}} | {{w1_success}} | {{w1_fail}} | {{w1_rate}}% |
| 7-14 天 | {{w2_total}} | {{w2_success}} | {{w2_fail}} | {{w2_rate}}% |
| 14-30 天 | {{w3_total}} | {{w3_success}} | {{w3_fail}} | {{w3_rate}}% |
## 三、性能概览
| 指标 | 数值 |
|------|------|
| 平均耗时 | {{avg_duration}} |
| 中位数耗时 | {{median_duration}} |
| P90 耗时 | {{p90_duration}} |
| 最快构建 | {{min_duration}}#{{min_run_id}} |
| 最慢构建 | {{max_duration}}#{{max_run_id}} |
## 四、故障摘要
> 如无失败运行,输出:**分析期内无失败运行,流水线运行健康。**
| 运行 ID | 工作流 | 分支 | 状态 | 耗时 | 错误模式 |
|---------|--------|------|------|------|----------|
| {{run_id}} | {{workflow}} | {{branch}} | {{status}} | {{duration}} | {{error_pattern}} |
## 五、改进建议
{{improvement_suggestions}}
---
*报告由 gitlink-pipeline-guardian 生成*
```
---
## 异常场景处理
| 场景 | 处理方式 |
|------|----------|
| 无流水线 | 报告"仓库尚未配置流水线",建议创建 `.gitea/workflows` 或通过 Web 界面创建 |
| 流水线全部禁用 | 标注"所有流水线已禁用",可用性评分为 0 |
| 运行记录为空 | 标注"流水线无运行记录",跳过成功率和性能评分 |
| `pipeline +logs` 返回空 | 标注"日志不可用",基于 `pipeline +results` 进行有限分析 |
| 构建记录 < 5 | 标注"样本量不足统计不具代表性" |
| 流水线数量 > 10 | 仅分析最近活跃的 10 条流水线 |
---
## 最佳实践
- 所有命令使用 `--format json`,确保输出可解析
- Owner/repo 优先从 `git remote` 自动解析
- 巡检类操作为只读,不会修改任何流水线配置
- 涉及启用/禁用/删除/运行操作需经用户确认后执行
- 批量获取运行记录时控制 API 调用频率,避免请求过快
- 日志分析时仅提取关键错误行,避免处理过多数据
- 将巡检报告保存为文件以便后续对比和追踪趋势

View File

@ -0,0 +1,300 @@
# 流水线健康巡检工作流示例
本文档展示如何使用 `gitlink-pipeline-guardian` Skill 对仓库 `whale_hihihi/gitlink-cli` 执行完整的流水线健康巡检,生成健康度评分报告。
> **前置条件**:已完成 `gitlink-cli auth login` 认证。详见 [`../gitlink-shared/SKILL.md`](../../gitlink-shared/SKILL.md)。
---
## Step 1获取流水线列表
查看仓库下所有流水线的基本信息。
```bash
gitlink-cli pipeline +list --owner-id 123 --page 1 --limit 20 --format json
```
预期输出:
```json
{
"pipelines": [
{"id": 7, "name": "CI Build", "status": "active"},
{"id": 8, "name": "Deploy Staging", "status": "active"},
{"id": 9, "name": "Deploy Production", "status": "disabled"},
{"id": 10, "name": "Nightly Tests", "status": "active"}
]
}
```
记录:共 4 条流水线3 条可用1 条已禁用Deploy Production
---
## Step 2获取近期运行记录
获取仓库的流水线运行历史。
```bash
gitlink-cli pipeline +runs --owner whale_hihihi --repo gitlink-cli --ref master --format json
```
预期输出:
```json
{
"runs": [
{"id": 101, "pipeline_id": 7, "workflow": "ci.yml", "ref": "master", "status": "success", "duration": 185, "started_at": "2026-06-08T09:00:00Z"},
{"id": 100, "pipeline_id": 7, "workflow": "ci.yml", "ref": "master", "status": "success", "duration": 192, "started_at": "2026-06-08T06:00:00Z"},
{"id": 99, "pipeline_id": 7, "workflow": "ci.yml", "ref": "master", "status": "failure", "duration": 67, "started_at": "2026-06-07T18:00:00Z"},
{"id": 98, "pipeline_id": 8, "workflow": "deploy-staging.yml", "ref": "master", "status": "success", "duration": 340, "started_at": "2026-06-07T15:00:00Z"},
{"id": 97, "pipeline_id": 7, "workflow": "ci.yml", "ref": "master", "status": "success", "duration": 178, "started_at": "2026-06-07T12:00:00Z"},
{"id": 96, "pipeline_id": 7, "workflow": "ci.yml", "ref": "master", "status": "success", "duration": 201, "started_at": "2026-06-07T09:00:00Z"},
{"id": 95, "pipeline_id": 7, "workflow": "ci.yml", "ref": "master", "status": "failure", "duration": 45, "started_at": "2026-06-06T18:00:00Z"},
{"id": 94, "pipeline_id": 7, "workflow": "ci.yml", "ref": "master", "status": "success", "duration": 188, "started_at": "2026-06-06T12:00:00Z"},
{"id": 93, "pipeline_id": 8, "workflow": "deploy-staging.yml", "ref": "master", "status": "success", "duration": 355, "started_at": "2026-06-06T10:00:00Z"},
{"id": 92, "pipeline_id": 7, "workflow": "ci.yml", "ref": "master", "status": "success", "duration": 195, "started_at": "2026-06-06T06:00:00Z"},
{"id": 91, "pipeline_id": 10, "workflow": "nightly.yml", "ref": "master", "status": "success", "duration": 620, "started_at": "2026-06-05T02:00:00Z"},
{"id": 90, "pipeline_id": 7, "workflow": "ci.yml", "ref": "master", "status": "success", "duration": 180, "started_at": "2026-06-05T09:00:00Z"}
]
}
```
统计摘要:
- 总运行12 次
- 成功10 次
- 失败2 次
- 成功率83.3%
---
## Step 3获取失败运行的结果详情
对失败的 run 99 和 run 95 获取结果。
```bash
gitlink-cli pipeline +results --owner whale_hihihi --repo gitlink-cli --run-id 99 --format json
```
预期输出:
```json
{
"run_id": 99,
"status": "failure",
"jobs": [
{"index": 0, "name": "lint", "status": "success", "duration": 15},
{"index": 1, "name": "test", "status": "failure", "duration": 52},
{"index": 2, "name": "build", "status": "skipped", "duration": 0}
]
}
```
确定失败阶段:`test`index=1
---
## Step 4获取失败日志
获取 run 99 的 test 阶段日志。
```bash
gitlink-cli pipeline +logs --owner whale_hihihi --repo gitlink-cli --run-id 99 --id 7 --index 1 --format json
```
预期输出:
```json
{
"logs": "--- Running test suite...\n=== FAIL: TestAuthLogin (0.32s)\n auth_test.go:45: expected status 200, got 500\n auth_test.go:46: server returned internal error\n=== FAIL: TestAPICall (0.18s)\n api_test.go:112: connection refused to localhost:8080\nFAIL\nexit code 1"
```
错误模式匹配:
- `connection refused`**F-TEST-002**(集成测试失败)
- `expected status 200, got 500`**F-TEST-001**(单元测试断言失败)
---
## Step 5查看流水线详情配置审计
查看各流水线的配置情况。
```bash
gitlink-cli pipeline +view --owner whale_hihihi --repo gitlink-cli --id 7 --format json
```
预期输出:
```json
{
"id": 7,
"name": "CI Build",
"description": "Main CI pipeline for build, test and lint",
"workflows": ["ci.yml"],
"triggers": ["push", "pull_request"],
"status": "active"
}
```
---
## Step 6补充 CI 构建数据
```bash
gitlink-cli ci +builds --owner whale_hihihi --repo gitlink-cli --format json
```
预期输出:
```json
{
"builds": [
{"id": 201, "status": "success", "branch": "master", "created_at": "2026-06-08T09:01:00Z"},
{"id": 200, "status": "success", "branch": "master", "created_at": "2026-06-08T06:01:00Z"},
{"id": 199, "status": "failed", "branch": "master", "created_at": "2026-06-07T18:01:00Z"}
]
}
```
CI 数据与 Pipeline 数据交叉验证一致。
---
## Step 7计算健康度评分
### 评分计算过程
**可用性(满分 20**
- 3 条可用 / 4 条总数 = 75%
- 得分15/20
**成功率(满分 25**
- 10 成功 / 12 总运行 = 83.3%
- 区间 ≥80% → 得分18/25
**稳定性(满分 20**
- 近 10 次8 次成功
- 区间 8-9 次 → 得分16/20
**性能(满分 15**
- CI 构建平均耗时:(185+192+67+178+201+45+188+195+180)/9 ≈ 159 秒 ≈ 2.7 分钟
- 区间 ≤5min → 得分12/15
**频率(满分 10**
- 最近 7 天有 10 次运行,每天均有构建
- 得分10/10
**规范性(满分 10**
- 有命名规范CI Build / Deploy Staging / Nightly Tests3 分
- 失败通知:未知(保守记 0 分)
- 缓存策略:未知(保守记 0 分)
- 并行配置:未知(保守记 0 分)
- 得分3/10
### 汇总
| 维度 | 得分 | 满分 |
|------|------|------|
| 可用性 | 15 | 20 |
| 成功率 | 18 | 25 |
| 稳定性 | 16 | 20 |
| 性能 | 12 | 15 |
| 频率 | 10 | 10 |
| 规范性 | 3 | 10 |
| **总分** | **74** | **100** |
**等级C需关注**
---
## 完整报告
以下是生成的完整巡检报告。
---
# 流水线健康巡检报告whale_hihihi/gitlink-cli
> 巡检时间2026-06-08 10:30:00
> 仓库whale_hihihi/gitlink-cli
> 流水线数量43 可用 / 1 禁用)
---
## 一、健康度总览
| 指标 | 数值 | 评分 |
|------|------|------|
| 可用性 | 3/4 条流水线可用 | 15/20 |
| 成功率 | 83.3%10/12 | 18/25 |
| 稳定性 | 近 10 次 8 次成功 | 16/20 |
| 性能 | 平均耗时 2.7 分钟 | 12/15 |
| 频率 | 每天有构建 | 10/10 |
| 规范性 | 通过 1/4 项 | 3/10 |
| **总分** | | **74/100等级 C — 需关注)** |
## 二、运行趋势
最近 20 次运行状态:
```
S S F S S S F S S S S S
```
S=成功 F=失败 R=运行中 -=待执行 C=已取消)
| 时间段 | 总运行 | 成功 | 失败 | 成功率 |
|--------|--------|------|------|--------|
| 最近 7 天 | 10 | 8 | 2 | 80% |
| 7-14 天 | 2 | 2 | 0 | 100% |
## 三、性能概览
| 指标 | 数值 |
|------|------|
| 平均耗时 | 2 分 39 秒 |
| 中位数耗时 | 3 分 5 秒 |
| P90 耗时 | 5 分 40 秒 |
| 最快构建 | 45 秒(#95 — 失败,提前终止) |
| 最慢构建 | 10 分 20 秒(#91 — Nightly Tests |
### 按流水线分组
| 流水线 | 运行次数 | 平均耗时 | 成功率 |
|--------|----------|----------|--------|
| CI Build (#7) | 9 | 3 分 5 秒 | 77.8% |
| Deploy Staging (#8) | 2 | 5 分 48 秒 | 100% |
| Nightly Tests (#10) | 1 | 10 分 20 秒 | 100% |
## 四、故障摘要
| 运行 ID | 工作流 | 分支 | 状态 | 耗时 | 错误模式 |
|---------|--------|------|------|------|----------|
| #99 | ci.yml | master | failure | 1 分 7 秒 | F-TEST-001 单元测试断言失败F-TEST-002 集成测试连接拒绝 |
| #95 | ci.yml | master | failure | 45 秒 | F-TEST-002 集成测试连接拒绝(未获取详细日志) |
### 根因分析
两次失败均发生在 `test` 阶段,共同特征为 `connection refused to localhost:8080`,表明测试依赖的本地服务在构建环境中未正确启动。这是**集成测试环境配置问题**F-TEST-002而非代码逻辑错误。
## 五、改进建议
### 高优先级
1. **修复集成测试环境**:两次失败均为测试服务连接失败。建议在 CI 工作流中添加服务启动步骤,确保 localhost:8080 在测试运行前可用。可使用 `docker-compose` 或内联脚本启动依赖服务。
2. **启用 Deploy Production 流水线**:当前 Deploy Production#9处于禁用状态。如已不再需要建议删除以减少管理负担如仍需要建议评估后重新启用。
### 中优先级
3. **配置失败通知**:当前未检测到失败通知机制。建议配置 Webhook 或邮件通知,确保构建失败时维护者能及时响应。
4. **添加缓存策略**CI 构建平均 3 分钟,其中依赖安装可能占比较高。建议启用依赖缓存(如 Go module cache、npm cache以缩短构建时间。
### 低优先级
5. **并行化测试阶段**Nightly Tests 耗时超过 10 分钟,可考虑将测试拆分为多个并行任务以缩短总耗时。
6. **启用 Deploy Production 后配置审批门禁**:确保生产部署需人工确认,避免自动部署引入风险。
---
*报告由 gitlink-pipeline-guardian 生成*

View File

@ -0,0 +1,497 @@
---
name: gitlink-webhook-sentinel
version: 1.0.0
description: "Webhook 监控哨兵:监控 Webhook 投递成功率、检测端点问题、验证安全配置、分析失败原因。当用户需要排查 Webhook 集成问题或监控 Webhook 健康状态时触发。"
metadata:
requires:
bins: ["gitlink-cli"]
cliHelp: "gitlink-cli webhook --help"
---
# gitlink-webhook-sentinelWebhook 监控哨兵)
**CRITICAL — 开始前必须先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md),其中包含认证、权限处理和 API 注意事项。**
**CRITICAL — 所有写入/删除操作前,务必先确认用户意图。**
**CRITICAL — GitLink 操作只能用 `gitlink-cli`。禁止用 `gh`GitHub CLI操作 GitLink 资源。`gh` 仅适用于 GitHub 平台。**
> **前置条件:** 先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md) 了解认证和全局参数。
## 工作流概览
本 Skill 提供一套完整的 Webhook 监控与诊断工作流,覆盖从健康巡检到故障排查、安全审计和配置优化的全过程。
| 阶段 | 操作 | AI Agent 角色 |
|------|------|--------------|
| 1 健康巡检 | 列出所有 Webhook检查投递历史识别失败端点 | 采集数据并生成健康报告 |
| 2 故障诊断 | 深入分析失败投递记录,检查响应码和 Payload | 定位根因并给出修复建议 |
| 3 安全审计 | 验证 Webhook Secret、Content-Type 配置、端点安全性 | 检出安全隐患并生成审计报告 |
| 4 配置优化 | 审查事件订阅、分支过滤器、配置合理性 | 提出优化建议并协助调整 |
---
## 命令参考
| 命令 | 说明 |
|------|------|
| `gitlink-cli webhook +list` | 列出仓库所有 Webhook |
| `gitlink-cli webhook +view --id <id>` | 查看单个 Webhook 详情 |
| `gitlink-cli webhook +create` | 创建 Webhook |
| `gitlink-cli webhook +update --id <id>` | 更新 Webhook |
| `gitlink-cli webhook +delete --id <id>` | 删除 Webhook |
| `gitlink-cli webhook +history --id <id>` | 查看 Webhook 投递历史(任务列表) |
| `gitlink-cli webhook +test --id <id>` | 发送测试事件到 Webhook 端点 |
### 支持的 Webhook 类型
| 类型 | 说明 |
|------|------|
| `gitea` | Gitea 原生格式(默认) |
| `slack` | Slack 通知 |
| `discord` | Discord 通知 |
| `dingtalk` | 钉钉机器人 |
| `telegram` | Telegram Bot |
| `msteams` | Microsoft Teams |
| `feishu` | 飞书机器人 |
| `matrix` | Matrix 协议 |
| `jianmu` | 建木 CI |
| `softbot` | SoftBot |
### 支持的事件类型
| 事件 | 说明 |
|------|------|
| `push` | 推送代码 |
| `create` | 创建分支/标签 |
| `delete` | 删除分支/标签 |
| `issues_only` | Issue 创建/更新 |
| `issue_assign` | Issue 分配 |
| `issue_label` | Issue 标签变更 |
| `issue_comment` | Issue 评论 |
| `pull_request_only` | PR 创建/更新 |
| `pull_request_assign` | PR 分配 |
| `pull_request_comment` | PR 评论 |
### create/update 参数
| 参数 | 短选项 | 说明 | 默认值 |
|------|--------|------|--------|
| `--url` | `-u` | Webhook 端点 URL | (必填) |
| `--events` | `-e` | 逗号分隔的事件列表 | (必填) |
| `--type` | `-t` | Webhook 类型 | `gitea` |
| `--content-type` | | 内容格式:`json` 或 `form` | `json` |
| `--http-method` | | HTTP 方法:`GET` 或 `POST` | `POST` |
| `--secret` | `-s` | Webhook 签名密钥 | |
| `--branch-filter` | | 分支过滤通配符 | `*` |
| `--active` | | 是否激活:`true` 或 `false` | `true` |
---
## 工作流 1Webhook 健康巡检
**场景**:定期巡检仓库所有 Webhook 的运行状态,识别投递失败的端点。
### Step 1获取所有 Webhook 列表
```bash
# 列出仓库所有 Webhook
gitlink-cli webhook +list --format json
```
分析返回数据,关注以下字段:
- `id`Webhook ID
- `url`:端点地址
- `active`:是否激活
- `type`Webhook 类型
- `events`:订阅的事件列表
- `branch_filter`:分支过滤规则
### Step 2逐个检查投递历史
```bash
# 查看每个 Webhook 的投递任务记录
gitlink-cli webhook +history --id <webhook_id> --format json
```
对每个 Webhook统计
- 总投递次数
- 成功次数HTTP 2xx 响应)
- 失败次数HTTP 4xx/5xx 响应或超时)
- 投递成功率
### Step 3发送测试事件验证活跃端点
```bash
# 对可疑或长时间无投递记录的 Webhook 发送测试
gitlink-cli webhook +test --id <webhook_id> --format json
```
### Step 4生成健康报告
按以下模板输出巡检报告:
```markdown
## Webhook 健康巡检报告 — <owner>/<repo>
### 总览
| 指标 | 数值 |
|------|------|
| Webhook 总数 | <total> |
| 活跃 Webhook | <active_count> |
| 未激活 Webhook | <inactive_count> |
| 健康端点 | <healthy_count> |
| 异常端点 | <unhealthy_count> |
| 整体成功率 | <success_rate>% |
### 端点健康状态
| ID | URL | 类型 | 状态 | 成功率 | 最近失败原因 |
|----|-----|------|:----:|:------:|-------------|
| <id> | <url> | <type> | Healthy/Warning/Critical | xx% | <reason> |
### 异常端点详情
#### Webhook #<id><url>
- **类型**<type>
- **事件订阅**<events>
- **分支过滤**<branch_filter>
- **最近投递状态**<last_delivery_status>
- **连续失败次数**<consecutive_failures>
- **建议操作**<recommendation>
---
*由 gitlink-webhook-sentinel Skill 自动生成*
```
---
## 工作流 2故障诊断
**场景**:当某个 Webhook 投递失败时,深入分析失败原因。
### Step 1获取 Webhook 详情
```bash
# 查看目标 Webhook 完整配置
gitlink-cli webhook +view --id <webhook_id> --format json
```
重点检查:
- `url`:端点地址是否正确、是否可达
- `content_type`:与目标系统期望的格式是否一致
- `http_method`:是否与端点期望的方法一致
- `active`:是否处于激活状态
- `secret`:是否已配置签名密钥
### Step 2获取投递历史
```bash
# 获取投递任务列表(包含每次投递的详细信息)
gitlink-cli webhook +history --id <webhook_id> --format json
```
分析每次投递记录:
- 响应状态码(`response_status_code`
- 响应内容(如有)
- 投递时间
- 是否成功
### Step 3根据状态码定位问题
参考「常见失败响应码参考表」进行匹配分析,确定根因类别。
### Step 4发送测试验证
```bash
# 发送测试事件以复现/验证问题
gitlink-cli webhook +test --id <webhook_id> --format json
```
### Step 5输出诊断报告
```markdown
## Webhook 故障诊断报告 — #<id> <url>
### 诊断摘要
| 项目 | 详情 |
|------|------|
| Webhook ID | <id> |
| 端点 URL | <url> |
| 类型 | <type> |
| 问题类别 | <category> |
| 严重程度 | Critical/Warning/Info |
### 根因分析
**主要原因**<primary_cause>
**证据**
- <evidence_1>
- <evidence_2>
### 修复建议
1. **立即操作**<immediate_fix>
2. **后续验证**<verification_step>
3. **长期优化**<long_term_improvement>
### 相关投递记录
| 时间 | 状态码 | 结果 |
|------|--------|------|
| <time> | <code> | Success/Failed |
```
---
## 工作流 3安全审计
**场景**:审查 Webhook 配置的安全性,检查 Secret 配置、Content-Type 和端点安全性。
### Step 1获取所有 Webhook 配置
```bash
# 列出所有 Webhook
gitlink-cli webhook +list --format json
# 逐个查看详细配置
gitlink-cli webhook +view --id <webhook_id> --format json
```
### Step 2安全检查清单
逐项审查以下安全指标:
| 检查项 | 安全标准 | 风险等级 |
|--------|----------|:--------:|
| Secret 配置 | 所有生产 Webhook 必须配置签名密钥 | Critical |
| URL 协议 | 必须使用 HTTPS禁止 HTTP | Critical |
| Content-Type | 推荐 `json`,避免 `form`(结构化更强) | Warning |
| URL 暴露信息 | URL 中不应包含 Token、密钥等敏感信息 | Critical |
| 事件范围 | 仅订阅必要事件,避免过度订阅 | Warning |
| 分支过滤 | 生产环境应设置分支过滤,不建议 `*` | Info |
| 激活状态 | 已废弃的 Webhook 应设为未激活或删除 | Info |
### Step 3输出安全审计报告
```markdown
## Webhook 安全审计报告 — <owner>/<repo>
### 审计概要
| 指标 | 数值 |
|------|------|
| 审计 Webhook 数 | <total> |
| 通过检查 | <passed> |
| 存在风险 | <at_risk> |
| Critical 风险 | <critical_count> |
| Warning 风险 | <warning_count> |
### 检查结果
| ID | URL | Secret | HTTPS | Content-Type | 事件范围 | 风险等级 |
|----|-----|:------:|:-----:|:------------:|----------|:--------:|
| <id> | <url> | Yes/No | Yes/No | json/form | <events> | Healthy/At Risk |
### Critical 问题
#### Webhook #<id> — 未配置 Secret
- **影响**:任何人都可以伪造 Webhook Payload存在安全风险
- **修复**
```bash
gitlink-cli webhook +update --id <id> --secret "<strong_secret>"
```
- **注意**:更新 Secret 后需同步更新接收端的验签逻辑
#### Webhook #<id> — 使用 HTTP 端点
- **影响**Payload 以明文传输,可被中间人截获
- **修复**:将 URL 更改为 HTTPS 端点
```bash
gitlink-cli webhook +update --id <id> --url "https://..."
```
### Warning 问题
<按严重程度列出所有 Warning 级别问题>
### 改进建议
1. <suggestion_1>
2. <suggestion_2>
```
---
## 工作流 4Webhook 配置优化
**场景**:审查现有 Webhook 的配置合理性,优化事件订阅和分支过滤规则。
### Step 1获取当前配置
```bash
# 获取所有 Webhook 列表
gitlink-cli webhook +list --format json
# 查看每个 Webhook 的详细配置
gitlink-cli webhook +view --id <webhook_id> --format json
```
### Step 2配置审查
对每个 Webhook 逐项审查:
**事件订阅优化**
- 是否订阅了从未触发过的事件?建议移除
- 是否遗漏了必要的事件?建议补充
- 同一端点是否存在多个 Webhook 重复订阅?建议合并
**分支过滤优化**
- `branch_filter``*` 时:确认是否确实需要监听所有分支
- 生产环境建议限定为 `master,main,release-*` 等模式
- 开发环境可放宽为 `*``feature/*`
**类型与格式优化**
- 目标系统类型是否正确(`gitea` / `slack` / `dingtalk` 等)
- `content_type` 是否与目标系统匹配(推荐 `json`
- `http_method` 是否正确
**冗余清理**
- 是否有指向已下线服务的 Webhook应删除
- 是否有长期未激活的 Webhook确认是否仍需要
### Step 3生成优化建议
```markdown
## Webhook 配置优化报告 — <owner>/<repo>
### 优化概要
| 指标 | 数值 |
|------|------|
| 审查 Webhook 数 | <total> |
| 需要优化 | <needs_optimization> |
| 配置合理 | <well_configured> |
| 建议删除 | <recommend_deletion> |
### 优化建议明细
#### Webhook #<id><url>
**当前配置**
- 事件:<current_events>
- 分支过滤:<current_branch_filter>
- 类型:<current_type>
- Content-Type<current_content_type>
**优化建议**
| 项目 | 当前值 | 建议值 | 原因 |
|------|--------|--------|------|
| events | <current> | <suggested> | <reason> |
| branch-filter | <current> | <suggested> | <reason> |
**执行命令**
```bash
gitlink-cli webhook +update --id <id> --events "push,pull_request_only" --branch-filter "master,main"
```
### 冗余 Webhook 清理
| ID | URL | 原因 | 操作 |
|----|-----|------|------|
| <id> | <url> | <reason> | 删除/禁用 |
```
### Step 4执行优化需用户确认
**CRITICAL — 所有修改操作前务必确认用户意图。**
```bash
# 更新 Webhook 配置
gitlink-cli webhook +update --id <id> --events "<optimized_events>" --branch-filter "<filter>"
# 删除确认废弃的 Webhook需用户明确同意
gitlink-cli webhook +delete --id <id>
# 更新后发送测试验证
gitlink-cli webhook +test --id <id> --format json
```
---
## 常见失败响应码参考表
| HTTP 状态码 | 含义 | 可能原因 | 排查方向 |
|:-----------:|------|----------|----------|
| `200` | 成功 | 正常投递 | 无需处理 |
| `301/302` | 重定向 | 端点 URL 已变更 | 更新为最终目标 URL |
| `400` | 请求无效 | Payload 格式错误、Content-Type 不匹配 | 检查 `content_type` 配置,验证 Payload 结构 |
| `401` | 未认证 | 目标端点要求认证但未提供 | 检查 URL 是否需要 Basic Auth或在 URL 中嵌入认证参数 |
| `403` | 禁止访问 | 签名验证失败、IP 白名单未通过 | 检查 Secret 配置是否与接收端一致 |
| `404` | 未找到 | 端点 URL 错误或已下线 | 确认 URL 是否正确,服务是否在运行 |
| `408` | 请求超时 | 接收端处理过慢 | 优化接收端逻辑,或联系服务方 |
| `422` | 无法处理 | Payload 结构不符合目标系统预期 | 检查 `type` 配置是否匹配目标系统 |
| `429` | 请求过多 | 触发目标系统限流 | 降低事件触发频率或联系服务方提高限额 |
| `500` | 服务器内部错误 | 接收端服务异常 | 联系目标系统维护方 |
| `502` | 网关错误 | 目标服务器上游故障 | 检查目标服务是否正常,稍后重试 |
| `503` | 服务不可用 | 目标服务维护或过载 | 等待恢复后重试 |
| `504` | 网关超时 | 接收端响应时间过长 | 优化接收端处理逻辑,或设置异步处理 |
| Timeout | 连接超时 | 网络不通、DNS 解析失败、防火墙阻断 | 检查网络连通性、DNS 配置、防火墙规则 |
---
## Raw API 参考
Webhook 相关的 GitLink API 端点:
```bash
# 列出所有 Webhook
gitlink-cli api GET /v1/:owner/:repo/webhooks --format json
# 查看 Webhook 详情
gitlink-cli api GET /v1/:owner/:repo/webhooks/:id --format json
# 创建 Webhook
gitlink-cli api POST /v1/:owner/:repo/webhooks --body '{
"type": "gitea",
"active": true,
"content_type": "json",
"http_method": "POST",
"url": "https://example.com/webhook",
"secret": "your-secret",
"branch_filter": "master",
"events": ["push", "pull_request_only"]
}'
# 更新 Webhook
gitlink-cli api PUT /v1/:owner/:repo/webhooks/:id --body '{...}'
# 删除 Webhook
gitlink-cli api DELETE /v1/:owner/:repo/webhooks/:id
# 获取投递任务历史
gitlink-cli api GET /v1/:owner/:repo/webhooks/:id/hooktasks --format json
# 发送测试事件
gitlink-cli api POST /v1/:owner/:repo/webhooks/:id/tests
```
---
## 注意事项
- `webhook +history` 返回的是该 Webhook 的投递任务列表hooktasks包含每次投递的状态和响应信息
- `webhook +test` 会向目标端点发送一个测试 Payload请确保目标服务能处理测试事件
- 更新 Webhook 的 Secret 时,接收端的验签逻辑需同步更新
- 删除 Webhook 是不可逆操作,执行前务必确认
- 对于使用 `--format json` 的命令,建议配合 `jq` 工具进行数据过滤和统计
---
## 相关 Skill 交叉引用
| Skill | 关联场景 |
|-------|----------|
| [`gitlink-shared`](../gitlink-shared/SKILL.md) | 认证、全局参数、安全规则基础 |
| [`gitlink-workflow`](../gitlink-workflow/SKILL.md) | AI 自动化工作流 |
| [`gitlink-health`](../gitlink-health/SKILL.md) | 项目整体健康度分析Webhook 可作为子维度) |

View File

@ -0,0 +1,226 @@
# Webhook 健康巡检工作流示例
本文档展示一个完整的 Webhook 健康巡检工作流,涵盖列出 Webhook、检查投递历史、识别问题端点、安全审计和配置优化的全过程。
> **前置条件**:已完成 `gitlink-cli auth login` 认证。所有命令使用 `gitlink-cli`,不使用 `gh`
---
## 场景描述
仓库 `whale_hihihi/test` 配置了多个 Webhook需要
1. 巡检所有 Webhook 的健康状态
2. 诊断投递失败的端点
3. 审计安全配置
4. 优化 Webhook 配置
---
## Step 1列出所有 Webhook
```bash
# 获取仓库所有 Webhook
gitlink-cli webhook +list --owner whale_hihihi --repo test --format json
```
**示例输出分析**
假设仓库有 3 个 Webhook
- `#10``https://ci.example.com/webhook` (Gitea, active)
- `#11``https://hooks.slack.com/services/T00/B00/xxx` (Slack, active)
- `#12``http://dev.local:3000/hook` (Gitea, active)
**初步发现**
- Webhook #12 使用 HTTP 而非 HTTPS安全风险
- 共 3 个 Webhook全部处于激活状态
---
## Step 2逐个检查投递历史
```bash
# 检查 Webhook #10 的投递历史
gitlink-cli webhook +history --id 10 --format json
# 检查 Webhook #11 的投递历史
gitlink-cli webhook +history --id 11 --format json
# 检查 Webhook #12 的投递历史
gitlink-cli webhook +history --id 12 --format json
```
**示例分析**
| Webhook | 总投递 | 成功 | 失败 | 成功率 | 状态 |
|---------|--------|------|------|--------|------|
| #10 CI | 50 | 48 | 2 | 96% | Healthy |
| #11 Slack | 30 | 25 | 5 | 83% | Warning |
| #12 Dev | 10 | 3 | 7 | 30% | Critical |
---
## Step 3深入诊断异常端点
### 诊断 Webhook #11Slack
```bash
# 查看详细配置
gitlink-cli webhook +view --id 11 --format json
```
分析投递失败记录,发现响应码为 `403`。参考失败码表:
- `403` = 签名验证失败或 IP 白名单未通过
**结论**Slack Webhook Secret 可能配置不正确。
### 诊断 Webhook #12Dev Local
```bash
# 查看详细配置
gitlink-cli webhook +view --id 12 --format json
```
分析投递失败记录,发现响应码为 `504`(网关超时)和 `Timeout`(连接超时)。
**结论**:本地开发服务器响应过慢或网络不通。
### 发送测试验证
```bash
# 对 Webhook #11 发送测试
gitlink-cli webhook +test --id 11 --format json
# 对 Webhook #12 发送测试
gitlink-cli webhook +test --id 12 --format json
```
---
## Step 4安全审计
对每个 Webhook 逐项检查:
| 检查项 | #10 CI | #11 Slack | #12 Dev |
|--------|--------|-----------|---------|
| Secret 配置 | Yes | No | Yes |
| HTTPS | Yes | Yes | No |
| Content-Type | json | json | json |
| 事件范围 | push | push,issues_only,pull_request_only | push,create,delete |
| 分支过滤 | master | * | * |
**审计发现**
- **Critical**#11 未配置 Secret可被伪造
- **Critical**#12 使用 HTTP明文传输
- **Warning**#11 和 #12`branch_filter``*`(监听所有分支)
---
## Step 5配置优化建议
### Webhook #10CI— 配置合理
- 事件订阅和分支过滤合理,无需调整
### Webhook #11Slack— 需要修复
- 添加 Secret
- 收窄分支过滤
```bash
# 修复:添加 Secret 并限制分支过滤
gitlink-cli webhook +update --id 11 --secret "xJk9$mK2pL5qR8vW" --branch-filter "master,main"
```
### Webhook #12Dev Local— 建议禁用或删除
- 开发环境 Webhook使用 HTTP 且不稳定
- 建议禁用或删除
```bash
# 选项 A禁用
gitlink-cli webhook +update --id 12 --active false
# 选项 B删除需用户确认
gitlink-cli webhook +delete --id 12
```
---
## Step 6生成完整报告
巡检完成后,输出以下报告:
```markdown
## Webhook 健康巡检报告 — whale_hihihi/test
### 总览
| 指标 | 数值 |
|------|------|
| Webhook 总数 | 3 |
| 活跃 Webhook | 3 |
| 健康端点 | 1 |
| Warning 端点 | 1 |
| Critical 端点 | 1 |
| 整体成功率 | 76/90 (84.4%) |
### 端点健康状态
| ID | URL | 类型 | 状态 | 成功率 | 最近失败原因 |
|----|-----|------|:----:|:------:|-------------|
| 10 | https://ci.example.com/webhook | gitea | Healthy | 96% | — |
| 11 | https://hooks.slack.com/... | slack | Warning | 83% | 403 Forbidden |
| 12 | http://dev.local:3000/hook | gitea | Critical | 30% | 504 Gateway Timeout |
### 安全审计
| ID | Secret | HTTPS | 分支过滤 | 风险等级 |
|----|:------:|:-----:|----------|:--------:|
| 10 | Yes | Yes | master | Healthy |
| 11 | No | Yes | * | At Risk |
| 12 | Yes | No | * | At Risk |
### 异常端点详情
#### Webhook #11 — Slack 通知
- **问题**Secret 未配置 + 分支过滤过宽
- **连续失败**:最近 5 次投递中 5 次返回 403
- **修复命令**
```bash
gitlink-cli webhook +update --id 11 --secret "<secret>" --branch-filter "master,main"
```
#### Webhook #12 — Dev Local
- **问题**HTTP 明文传输 + 目标服务不稳定
- **连续失败**:最近 7 次投递中 7 次超时
- **修复建议**:确认服务是否仍在使用,若已废弃建议删除
```bash
gitlink-cli webhook +delete --id 12
```
### 优化操作汇总
| 优先级 | 操作 | 命令 |
|--------|------|------|
| P0 | 为 Slack Webhook 添加 Secret | `gitlink-cli webhook +update --id 11 --secret "..."` |
| P1 | 禁用/删除 Dev Local Webhook | `gitlink-cli webhook +delete --id 12` |
| P2 | Slack Webhook 收窄分支过滤 | `gitlink-cli webhook +update --id 11 --branch-filter "master,main"` |
---
*由 gitlink-webhook-sentinel Skill 自动生成*
```
---
## 后续验证
修复操作完成后,再次执行测试验证:
```bash
# 验证修复后的 Webhook #11
gitlink-cli webhook +test --id 11 --format json
# 确认 Webhook #12 已删除
gitlink-cli webhook +list --format json
```
预期结果:
- Webhook #11 测试投递返回 200
- Webhook 列表中不再包含 #12

View File

@ -0,0 +1,341 @@
---
name: gitlink-wiki-builder
version: 1.0.0
description: "Wiki 文档自动化:自动组织文档结构、生成侧边栏导航、创建文档模板、同步代码变更到 Wiki。当用户需要批量管理 Wiki 页面、生成项目文档或维护 Wiki 结构时触发。"
metadata:
requires:
bins: ["gitlink-cli"]
cliHelp: "gitlink-cli wiki --help"
---
# gitlink-wiki-builderWiki 文档自动化)
**CRITICAL — 开始前必须先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md),其中包含认证、权限处理和 API 注意事项。**
**CRITICAL — 所有写入/删除操作前,务必先确认用户意图。**
**CRITICAL — GitLink 操作只能用 `gitlink-cli`。禁止用 `gh`GitHub CLI操作 GitLink 资源。`gh` 仅适用于 GitHub 平台。**
> **前置条件:** 先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md) 了解认证和全局参数。
## 命令参考
GitLink Wiki 支持 9 个 CLI 命令:
| 命令 | 功能 | 关键 Flags |
|------|------|-----------|
| `wiki +list` | 列出所有 Wiki 页面 | `--format json` |
| `wiki +view` | 查看单个页面内容 | `--name (-n)` |
| `wiki +create` | 创建新页面 | `--name (-n)`, `--content (-c)`, `--message (-m)`, `--dir (-d)` |
| `wiki +update` | 更新页面内容 | `--name (-n)`, `--content (-c)`, `--message (-m)` |
| `wiki +delete` | 删除页面(自动清理侧边栏) | `--name (-n)` |
| `wiki +mkdir` | 创建侧边栏目录 | `--name (-n)`, `--parent (-p)` |
| `wiki +rmdir` | 删除侧边栏目录及子项 | `--name (-n)` |
| `wiki +rename` | 重命名页面(迁移内容 + 更新侧边栏) | `--name (-n)`, `--new-name (-N)` |
| `wiki +renamedir` | 重命名侧边栏目录 | `--name (-n)`, `--new-name (-N)` |
### 侧边栏结构模板
GitLink Wiki 使用 `_Sidebar` 特殊页面管理导航。侧边栏结构采用缩进层级:
```
- 开发指南
[[开发环境搭建]]
[[代码规范]]
[[提交规范]]
- API参考
[[REST API 概览]]
[[认证与授权]]
[[错误码说明]]
- 架构设计
[[系统架构总览]]
[[数据库设计]]
[[模块依赖关系]]
- 常见问题
[[安装问题排查]]
[[配置说明]]
[[FAQ]]
```
- 顶层目录以 `- 目录名` 表示
- 子页面以 Tab 缩进 + `[[页面名]]` 链接表示
- `wiki +create --dir <目录名>` 自动在对应目录下插入页面链接
- `wiki +mkdir` 创建新目录,`wiki +rmdir` 删除目录及其子项
---
## 工作流概览
| 阶段 | 工作流 | 说明 |
|------|--------|------|
| 1 | 文档结构初始化 | 创建完整的 Wiki 目录结构和索引页面 |
| 2 | 侧边栏导航维护 | 自动生成和更新侧边栏导航 |
| 3 | 文档模板生成 | 创建标准文档模板(贡献指南、开发环境等) |
| 4 | 批量页面更新 | 批量更新 Wiki 页面内容 |
---
## 详细工作流
### 工作流 1文档结构初始化
**场景**:项目新建或重构时,一键创建标准化的 Wiki 文档结构。
#### Step 1创建侧边栏顶级目录
```bash
# 创建四大核心目录
gitlink-cli wiki +mkdir --name "开发指南"
gitlink-cli wiki +mkdir --name "API参考"
gitlink-cli wiki +mkdir --name "架构设计"
gitlink-cli wiki +mkdir --name "常见问题"
```
> 目录创建后会在 `_Sidebar` 页面自动添加对应的顶级条目。
#### Step 2在各目录下创建索引页面
```bash
# 开发指南目录
gitlink-cli wiki +create \
--name "开发环境搭建" \
--content "# 开发环境搭建\n\n## 前置要求\n\n...\n\n## 安装步骤\n\n...\n\n## 常用命令\n\n..." \
--message "初始化:创建开发环境搭建文档" \
--dir "开发指南"
gitlink-cli wiki +create \
--name "代码规范" \
--content "# 代码规范\n\n## 命名约定\n\n...\n\n## 格式化\n\n..." \
--message "初始化:创建代码规范文档" \
--dir "开发指南"
gitlink-cli wiki +create \
--name "提交规范" \
--content "# 提交规范\n\n## Commit Message 格式\n\n...\n\n## 分支策略\n\n..." \
--message "初始化:创建提交规范文档" \
--dir "开发指南"
# API参考目录
gitlink-cli wiki +create \
--name "REST API 概览" \
--content "# REST API 概览\n\n## 基础 URL\n\n...\n\n## 认证方式\n\n...\n\n## 通用响应格式\n\n..." \
--message "初始化:创建 API 概览文档" \
--dir "API参考"
gitlink-cli wiki +create \
--name "认证与授权" \
--content "# 认证与授权\n\n## OAuth2 流程\n\n...\n\n## Token 管理\n\n..." \
--message "初始化:创建认证文档" \
--dir "API参考"
gitlink-cli wiki +create \
--name "错误码说明" \
--content "# 错误码说明\n\n## HTTP 状态码\n\n...\n\n## 业务错误码\n\n..." \
--message "初始化:创建错误码文档" \
--dir "API参考"
# 架构设计目录
gitlink-cli wiki +create \
--name "系统架构总览" \
--content "# 系统架构总览\n\n## 整体架构\n\n...\n\n## 核心模块\n\n..." \
--message "初始化:创建架构总览文档" \
--dir "架构设计"
# 常见问题目录
gitlink-cli wiki +create \
--name "FAQ" \
--content "# 常见问题\n\n## 安装相关\n\n### Q: 安装失败怎么办?\n\n...\n\n## 使用相关\n\n..." \
--message "初始化:创建 FAQ 文档" \
--dir "常见问题"
```
> `--dir` 参数会在侧边栏对应目录下自动添加 `[[页面名]]` 链接。
#### Step 3验证结构
```bash
# 列出所有 Wiki 页面,确认创建结果
gitlink-cli wiki +list --format json
# 查看侧边栏,确认导航结构正确
gitlink-cli wiki +view --name "_Sidebar"
```
---
### 工作流 2侧边栏导航维护
**场景**:项目文档结构变更时,自动维护侧边栏导航的一致性。
#### 场景 A添加新页面到已有目录
```bash
# 创建页面并直接关联到目录
gitlink-cli wiki +create \
--name "部署指南" \
--content "# 部署指南\n\n## Docker 部署\n\n...\n\n## 手动部署\n\n..." \
--message "添加部署指南" \
--dir "开发指南"
```
> `--dir` 自动将 `[[部署指南]]` 插入到侧边栏 "开发指南" 目录下。
#### 场景 B添加新的子目录
```bash
# 在已有目录下创建子目录
gitlink-cli wiki +mkdir --name "数据库" --parent "架构设计"
# 在子目录下创建页面
gitlink-cli wiki +create \
--name "数据库设计" \
--content "# 数据库设计\n\n## ER 图\n\n...\n\n## 表结构说明\n\n..." \
--message "添加数据库设计文档" \
--dir "数据库"
```
> `--parent` 在指定目录下创建缩进的子目录。
#### 场景 C删除页面和目录
```bash
# 删除页面(自动从侧边栏移除链接)
gitlink-cli wiki +delete --name "旧文档"
# 删除目录(自动移除目录及所有子项)
gitlink-cli wiki +rmdir --name "废弃目录"
```
> `+delete` 会自动清理侧边栏中对应的 `[[页面名]]` 链接。`+rmdir` 会移除目录行及所有子行。
#### 场景 D重命名页面和目录
```bash
# 重命名页面(自动迁移内容 + 更新侧边栏链接)
gitlink-cli wiki +rename --name "旧名称" --new-name "新名称"
# 重命名目录(更新侧边栏中的目录标题)
gitlink-cli wiki +renamedir --name "旧目录名" --new-name "新目录名"
```
> `+rename` 执行"获取旧页面内容 → 创建新页面 → 删除旧页面 → 更新侧边栏"的完整流程。
---
### 工作流 3文档模板生成
**场景**:为新项目或标准化流程批量创建文档模板页面。
#### Step 1生成贡献指南
```bash
gitlink-cli wiki +create \
--name "CONTRIBUTING" \
--content "# 贡献指南\n\n感谢你对本项目的关注以下是参与贡献的流程。\n\n## 如何贡献\n\n### 报告 Bug\n\n1. 搜索已有 Issue确认没有被报告过\n2. 创建新 Issue包含复现步骤、预期行为、实际行为、环境信息\n\n### 提交代码\n\n1. Fork 本仓库\n2. 创建功能分支:\n\n\`\`\`bash\ngit checkout -b feature/my-feature\n\`\`\`\n\n3. 提交更改,遵循 [提交规范](/提交规范)\n4. 发起 Pull Request\n\n### 代码审查\n\n所有 PR 需要至少一位维护者 Review 通过后方可合并。\n\n## 行为准则\n\n请尊重所有贡献者保持友善和建设性的交流。\n" \
--message "创建贡献指南模板" \
--dir "开发指南"
```
#### Step 2生成开发环境搭建文档
```bash
gitlink-cli wiki +create \
--name "开发环境搭建" \
--content "# 开发环境搭建\n\n## 系统要求\n\n| 工具 | 最低版本 |\n|------|----------|\n| Go | 1.21+ |\n| Git | 2.30+ |\n\n## 快速开始\n\n\`\`\`bash\n# 克隆仓库\ngit clone <repo-url>\ncd <repo-name>\n\n# 安装依赖\ngo mod download\n\n# 构建\ngo build -o gitlink-cli .\n\n# 运行测试\ngo test ./...\n\`\`\`\n\n## IDE 推荐\n\n- VS Code + Go 扩展\n- GoLand\n\n## 常见问题\n\n参见 [[FAQ]]\n" \
--message "创建开发环境搭建模板" \
--dir "开发指南"
```
#### Step 3生成 API 文档模板
```bash
gitlink-cli wiki +create \
--name "API 文档模板" \
--content "# API 文档模板\n\n## 接口名称\n\n简要描述接口用途。\n\n### 请求\n\n\`\`\`\nMETHOD /api/v1/endpoint\n\`\`\`\n\n**请求参数:**\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|:----:|------|\n| | | | |\n\n### 响应\n\n**成功响应200**\n\n\`\`\`json\n{\n \"status\": 0,\n \"message\": \"success\",\n \"data\": {}\n}\n\`\`\`\n\n**错误响应:**\n\n| 状态码 | 说明 |\n|--------|------|\n| 400 | 参数错误 |\n| 401 | 未认证 |\n| 403 | 无权限 |\n| 404 | 资源不存在 |\n" \
--message "创建 API 文档模板" \
--dir "API参考"
```
---
### 工作流 4批量页面更新
**场景**:版本升级、全局术语变更或批量内容修正时,一次性更新多个 Wiki 页面。
#### Step 1获取当前所有页面列表
```bash
# 列出所有页面,确定需要更新的范围
gitlink-cli wiki +list --format json
```
#### Step 2逐个读取并分析页面内容
```bash
# 查看需要更新的页面
gitlink-cli wiki +view --name "开发环境搭建"
gitlink-cli wiki +view --name "部署指南"
gitlink-cli wiki +view --name "REST API 概览"
```
> Agent 应解析 `wiki +view` 的输出,提取 `content_base64` 字段,解码后分析需要修改的部分。
#### Step 3批量更新页面
```bash
# 更新版本号(示例:全局升级 v1.0 → v2.0
gitlink-cli wiki +update \
--name "开发环境搭建" \
--content "# 开发环境搭建\n\n## 系统要求\n\n| 工具 | 最低版本 |\n|------|----------|\n| Go | 1.22+ |\n| Git | 2.40+ |\n\n..." \
--message "更新:升级系统要求版本"
gitlink-cli wiki +update \
--name "部署指南" \
--content "# 部署指南v2.0\n\n## 变更说明\n\nv2.0 新增以下部署要求:\n\n..." \
--message "更新:同步 v2.0 部署变更"
gitlink-cli wiki +update \
--name "REST API 概览" \
--content "# REST API 概览\n\n## 基础 URL\n\n`https://api.example.com/v2`\n\n..." \
--message "更新API 基础 URL 升级至 v2"
```
#### 批量更新注意事项
- 所有写入操作前**必须确认用户意图**,特别是涉及多个页面的批量更新
- 建议先在单个页面上验证更新效果,确认无误后再批量执行
- 每次更新提供清晰的 `--message`,便于后续追溯变更历史
- 如果更新过程中某个页面失败,记录失败的页面名称和错误信息,继续处理剩余页面
---
## 侧边栏操作速查
| 操作 | 命令 | 侧边栏效果 |
|------|------|-----------|
| 创建顶级目录 | `wiki +mkdir --name "目录名"` | 添加 `- 目录名` |
| 创建子目录 | `wiki +mkdir --name "子目录" --parent "父目录"` | 在父目录下缩进添加 `- 子目录` |
| 删除目录 | `wiki +rmdir --name "目录名"` | 移除目录及所有子行 |
| 重命名目录 | `wiki +renamedir --name "旧名" --new-name "新名"` | 替换目录标题 |
| 创建页面到目录 | `wiki +create --name "页面" --content "..." --dir "目录"` | 在目录下添加 `[[页面]]` |
| 删除页面 | `wiki +delete --name "页面"` | 自动移除 `[[页面]]` 链接 |
| 重命名页面 | `wiki +rename --name "旧名" --new-name "新名"` | 自动替换 `[[旧名]]``[[新名]]` |
---
## 注意事项
- Wiki 操作通过独立的网关 API`gateway.gitlink.org.cn/api`)执行,与仓库 API 不同
- `wiki +create --dir` 要求目录已存在于侧边栏中,否则会报错;应先 `wiki +mkdir``wiki +create --dir`
- `wiki +rename` 执行"获取内容 → 创建新页面 → 删除旧页面 → 更新侧边栏"的完整流程,操作不可逆
- `wiki +rmdir` 会删除目录及该目录下所有子项(页面链接和子目录),操作不可逆
- 侧边栏使用 Tab 缩进表示层级,手动编辑 `_Sidebar` 页面时请保持缩进一致
- 建议在执行批量操作前先用 `wiki +list``wiki +view --name "_Sidebar"` 确认当前状态
---
## 相关 Skill 交叉引用
| Skill | 关联场景 |
|-------|----------|
| [`gitlink-shared`](../gitlink-shared/SKILL.md) | 认证、全局参数、安全规则基础 |
| [`gitlink-code-review`](../gitlink-code-review/SKILL.md) | 审查 PR 时同步更新 Wiki 文档 |
| [`gitlink-workflow`](../gitlink-workflow/SKILL.md) | 自动化工作流,可结合 Wiki 更新 |

View File

@ -0,0 +1,356 @@
# Wiki 从零初始化工作流示例
本文档展示如何使用 `gitlink-wiki-builder` Skill 为新仓库 `whale_hihihi/test` 从零搭建完整的 Wiki 文档结构。
> **前置条件**:已完成 `gitlink-cli auth login` 认证。详见 [`../../gitlink-shared/SKILL.md`](../../gitlink-shared/SKILL.md)。
---
## Step 1确认当前 Wiki 状态
初始化前先查看当前 Wiki 页面列表,确认是否为空或存在已有内容。
```bash
# 列出所有 Wiki 页面
gitlink-cli wiki +list --owner whale_hihihi --repo test --format json
```
预期输出(空 Wiki
```json
{
"code": 0,
"message": "success",
"data": []
}
```
---
## Step 2创建顶级目录结构
为项目创建四个核心文档分类目录。
```bash
# 创建顶级目录
gitlink-cli wiki +mkdir --name "开发指南" --owner whale_hihihi --repo test
gitlink-cli wiki +mkdir --name "API参考" --owner whale_hihihi --repo test
gitlink-cli wiki +mkdir --name "架构设计" --owner whale_hihihi --repo test
gitlink-cli wiki +mkdir --name "常见问题" --owner whale_hihihi --repo test
```
预期输出:
```
Directory "开发指南" created.
Directory "API参考" created.
Directory "架构设计" created.
Directory "常见问题" created.
```
---
## Step 3在"开发指南"目录下创建页面
```bash
# 创建开发环境搭建文档
gitlink-cli wiki +create \
--name "开发环境搭建" \
--content "# 开发环境搭建
## 系统要求
| 工具 | 最低版本 |
|------|----------|
| Go | 1.21+ |
| Git | 2.30+ |
## 快速开始
1. 克隆仓库:\`git clone https://gitlink.org.cn/whale_hihihi/test.git\`
2. 安装依赖:\`go mod download\`
3. 构建:\`go build -o test .\`
4. 运行测试:\`go test ./...\`
## IDE 配置
推荐使用 VS Code + Go 扩展,安装后可获得代码补全、跳转定义和调试支持。" \
--message "初始化:创建开发环境搭建文档" \
--dir "开发指南" \
--owner whale_hihihi --repo test
# 创建代码规范文档
gitlink-cli wiki +create \
--name "代码规范" \
--content "# 代码规范
## 命名约定
- 包名:小写单词,不使用下划线(如 \`shortcuts\`
- 导出函数:大驼峰(如 \`CreateWiki\`
- 内部函数:小驼峰(如 \`fetchProjectID\`
- 常量:大写 + 下划线(如 \`MAX_RETRIES\`
## 格式化
使用 \`gofmt\` 或 \`goimports\` 格式化代码,提交前确保通过 \`golangci-lint run\`。
## 注释规范
- 导出标识符必须有文档注释
- 注释以标识符名称开头:\`// Shortcuts returns wiki management shortcuts.\`" \
--message "初始化:创建代码规范文档" \
--dir "开发指南" \
--owner whale_hihihi --repo test
# 创建贡献指南
gitlink-cli wiki +create \
--name "CONTRIBUTING" \
--content "# 贡献指南
感谢你对本项目的关注!
## 报告 Bug
1. 搜索已有 Issue确认未被报告
2. 创建新 Issue包含复现步骤、预期行为、实际行为、环境信息
## 提交代码
1. Fork 仓库
2. 创建功能分支:\`git checkout -b feature/my-feature\`
3. 提交更改,遵循 Commit Message 规范
4. 发起 Pull Request
## 代码审查
所有 PR 需要至少一位维护者 Review 通过后方可合并。" \
--message "初始化:创建贡献指南" \
--dir "开发指南" \
--owner whale_hihihi --repo test
```
预期输出(每个页面):
```
Page "开发环境搭建" added to directory "开发指南" in sidebar.
Page "代码规范" added to directory "开发指南" in sidebar.
Page "CONTRIBUTING" added to directory "开发指南" in sidebar.
```
---
## Step 4在"API参考"目录下创建页面
```bash
# 创建 API 概览
gitlink-cli wiki +create \
--name "REST API 概览" \
--content "# REST API 概览
## 基础 URL
\`https://api.example.com/v1\`
## 认证方式
所有 API 请求需在 Header 中携带 Token
\`\`\`
Authorization: Bearer <token>
\`\`\`
## 通用响应格式
\`\`\`json
{
\"status\": 0,
\"message\": \"success\",
\"data\": {}
}
\`\`\`
## 速率限制
每个 Token 每分钟最多 60 次请求。" \
--message "初始化:创建 API 概览文档" \
--dir "API参考" \
--owner whale_hihihi --repo test
# 创建错误码文档
gitlink-cli wiki +create \
--name "错误码说明" \
--content "# 错误码说明
## HTTP 状态码
| 状态码 | 说明 |
|--------|------|
| 200 | 成功 |
| 400 | 参数错误 |
| 401 | 未认证 |
| 403 | 无权限 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
## 业务错误码
| 错误码 | 说明 | 处理建议 |
|--------|------|----------|
| 10001 | Token 过期 | 重新获取 Token |
| 10002 | 权限不足 | 联系管理员 |
| 20001 | 资源已存在 | 检查是否重复创建 |" \
--message "初始化:创建错误码文档" \
--dir "API参考" \
--owner whale_hihihi --repo test
```
---
## Step 5在"架构设计"目录下创建页面和子目录
```bash
# 创建架构总览
gitlink-cli wiki +create \
--name "系统架构总览" \
--content "# 系统架构总览
## 整体架构
项目采用分层架构:
- **CLI 层**命令行解析和用户交互Cobra 框架)
- **Shortcut 层**高级命令封装Issue、PR、Wiki 等)
- **API 层**GitLink REST API 客户端
- **工具层**:输出格式化、国际化、配置管理
## 核心模块
| 模块 | 路径 | 说明 |
|------|------|------|
| shortcuts | ./shortcuts/ | 高级命令封装 |
| internal | ./internal/ | 内部工具库 |
| cmd | ./cmd/ | CLI 入口 |" \
--message "初始化:创建架构总览文档" \
--dir "架构设计" \
--owner whale_hihihi --repo test
# 创建子目录"数据库"并在其中创建页面
gitlink-cli wiki +mkdir --name "数据库" --parent "架构设计" \
--owner whale_hihihi --repo test
gitlink-cli wiki +create \
--name "数据库设计" \
--content "# 数据库设计
## 设计原则
- 所有表使用自增 ID 作为主键
- 时间字段统一使用 \`datetime\` 类型
- 软删除使用 \`is_deleted\` 标记
## 核心表
### users 表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int | 主键 |
| user_name | varchar(50) | 用户名 |
| email | varchar(100) | 邮箱 |
| created_at | datetime | 创建时间 |" \
--message "初始化:创建数据库设计文档" \
--dir "数据库" \
--owner whale_hihihi --repo test
```
---
## Step 6在"常见问题"目录下创建页面
```bash
gitlink-cli wiki +create \
--name "FAQ" \
--content "# 常见问题
## 安装相关
### Q: go build 失败怎么办?
确认 Go 版本 >= 1.21,然后执行:
\`\`\`bash
go clean -cache
go mod tidy
go build -o test .
\`\`\`
### Q: 认证失败怎么办?
1. 确认已执行 \`gitlink-cli auth login\`
2. 检查 Token 是否过期
3. 重新登录:\`gitlink-cli auth login --force\`
## 使用相关
### Q: Wiki 命令返回 404
Wiki 功能需要在 GitLink 项目中先启用 Wiki 模块。在项目设置中开启后重试。
### Q: 如何查看 API 请求的详细信息?
使用 \`--verbose\` 参数查看请求和响应的详细信息:
\`\`\`bash
gitlink-cli wiki +list --verbose
\`\`\`" \
--message "初始化:创建 FAQ 文档" \
--dir "常见问题" \
--owner whale_hihihi --repo test
```
---
## Step 7验证最终结构
```bash
# 查看侧边栏,确认目录和页面结构正确
gitlink-cli wiki +view --name "_Sidebar" --owner whale_hihihi --repo test
# 列出所有页面
gitlink-cli wiki +list --owner whale_hihihi --repo test --format json
```
预期侧边栏结构:
```
- 开发指南
[[开发环境搭建]]
[[代码规范]]
[[CONTRIBUTING]]
- API参考
[[REST API 概览]]
[[错误码说明]]
- 架构设计
[[系统架构总览]]
- 数据库
[[数据库设计]]
- 常见问题
[[FAQ]]
```
---
## 执行汇总
| 操作 | 数量 | 命令 |
|------|:----:|------|
| 创建顶级目录 | 4 | `wiki +mkdir` |
| 创建子目录 | 1 | `wiki +mkdir --parent` |
| 创建 Wiki 页面 | 9 | `wiki +create --dir` |
总计执行 14 条 `gitlink-cli` 命令,完成从零到完整 Wiki 文档结构的搭建。
---
*由 gitlink-wiki-builder Skill 示例工作流生成*