gitlink-cli/examples/workflows/community-ops/skills/gitlink-release-notes/SKILL.md

16 KiB
Raw Blame History

name version description license metadata
gitlink-release-notes 1.0.0 Release Notes 自动生成与发布:在 GitHub / GitLink / GitLab / Gitee 等开源项目中,自动汇总已关闭 Issue按 Bug 修复 / 新功能 / 其他改进分类,生成结构化 Release Notes 并发布为正式版本。触发场景:发布 Release Notes、生成版本说明、版本发布、changelog、release notes、自动发布版本。 MulanPSL-2.0
requires cliHelp platforms
bins_any bins_note
gitlink-cli
gh
glab
curl
gitee 后端无官方 CLI直接使用 curl 调用 https://gitee.com/api/v5/ REST API其余三后端用对应原生 CLI
gitlink-cli release --help
agents backends
openclaw
claude-code
cursor
generic-agent
id cli url_template api_base auth_env default
gitlink gitlink-cli https://www.gitlink.org.cn/{owner}/{repo} https://www.gitlink.org.cn/api/v1 GITLINK_TOKEN true
id cli url_template api_base auth_env
github gh https://github.com/{owner}/{repo} https://api.github.com GH_TOKEN
id cli url_template api_base auth_env
gitlab glab https://gitlab.com/{owner}/{repo} https://gitlab.com/api/v4 GITLAB_TOKEN
id cli url_template api_base auth_env
gitee curl https://gitee.com/{owner}/{repo} https://gitee.com/api/v5 GITEE_TOKEN

gitlink-release-notesRelease Notes 自动生成与发布)

CRITICAL — 开始前必须先阅读 ../gitlink-shared/SKILL.md(仅 GitLink 后端)或对应平台的 CLI 文档。所有 GitHub 操作必须使用 gh;所有 GitLab 操作必须使用 glab;所有 GitLink 操作必须使用 gitlink-cli。禁止混用或替代。 CRITICAL — 本 Skill 包含写入操作(创建 Release。默认必须先做 dry-run仅预览经用户明确确认后才执行发布。 CRITICAL — 创建 Release 前必须检查已有 Releasetag 去重),避免重复发布。

依赖工具: 二选一即可——gitlink-cli / gh / glab,外加 jq依赖 Skill 使用 GitLink 后端时需加载 gitlink-shared;使用 GitHub / GitLab 时无需额外 Skill。 本 Skill 为 C1 模式(纯文档):所有命令由 Agent 按本文件步骤直接调用对应平台 CLI 执行。


功能概述

本 Skill 是自包含Release Notes 分类逻辑与模板直接内嵌在 SKILL.md 中Agent 从本文件读取规范,不需要从外部仓库拉取配置。

  1. 后端检测Agent 自动识别当前仓库所在的平台
  2. 数据采集Agent 用对应 CLI 收集已关闭 Issue、开放 Issue、已有 Release
  3. 分类汇总:按 Bug 修复 / 新功能 / 其他改进三组分类
  4. 版本命名:自动生成版本号(日期格式),去重已有 tag
  5. 内容生成Agent 按内嵌模板生成结构化 Markdown Release Notes
  6. dry-run 预览Agent 输出 Release Notes等待用户确认
  7. 发布用户确认后Agent 用对应 CLI 创建 Release

⚠️ 设计约束:版本号格式为 vYYYY.MM.DD(日期格式)。如当天已有同名 tag追加序号 -N

触发场景

用户提到以下关键词时自动触发:

  • "发布 Release Notes"、"生成版本说明"、"版本发布"
  • "release notes"、"changelog"、"自动发布版本"
  • "帮我创建一个 release"

平台适配

后端自动检测

detect_backend() {
  local remote_url
  remote_url="$(git remote get-url origin 2>/dev/null || echo '')"

  case "$remote_url" in
    *gitlink.org.cn*)        echo "gitlink" ;;
    *github.com*)            echo "github"  ;;
    *gitlab.com*|*gitlab.*)  echo "gitlab"  ;;
    *gitee.com*)             echo "gitee"   ;;
  esac

  command -v gitlink-cli >/dev/null && echo "gitlink"
  command -v gh          >/dev/null && echo "github"
  command -v glab        >/dev/null && echo "gitlab"
  command -v curl        >/dev/null && echo "gitee"
}

命令映射表

步骤 目的 GitLink (gitlink-cli) GitHub (gh) GitLab (glab) Gitee (curl)
认证检查 确认已登录 gitlink-cli auth status gh auth status glab auth status test -n "$GITEE_TOKEN"
列关闭 Issue 取已关闭 Issue gitlink-cli issue +list --owner X --repo Y --state closed --format json gh issue list --repo X/Y --state closed --json number,title,labels glab issue list --repo X/Y --state closed --output json curl -s "https://gitee.com/api/v5/repos/X/Y/issues?state=closed&access_token=$GITEE_TOKEN"
列开放 Issue 取开放 Issue待处理 gitlink-cli issue +list --owner X --repo Y --state open --format json gh issue list --repo X/Y --state open --json number,title,labels glab issue list --repo X/Y --state opened --output json curl -s "https://gitee.com/api/v5/repos/X/Y/issues?state=open&access_token=$GITEE_TOKEN"
列 Release 已有版本去重 gitlink-cli release +list --owner X --repo Y --format json gh release list --repo X/Y --json tagName glab release list --repo X/Y --output json curl -s "https://gitee.com/api/v5/repos/X/Y/releases?access_token=$GITEE_TOKEN"
创建 Release 发布版本 gitlink-cli release +create --owner X --repo Y --name V --tag V --target master --body "..." --format json gh release create V --repo X/Y --title V --notes "..." --target master glab release create V --repo X/Y --name V --notes "..." --ref master curl -X POST "https://gitee.com/api/v5/repos/X/Y/releases?access_token=$GITEE_TOKEN&tag_name=V&name=V&body=..."

字段名差异

概念 GitLink GitHub GitLab Gitee
Issue 标题 subject title title title
Issue 标签 issue_tags (数组 of {name,id}) labels (数组 of {name}) labels (数组 of {name}) labels (逗号分隔)
Release tag tag_name tagName tag_name tag_name
Release name name name name name

Issue 分类逻辑(内嵌)

Agent 对已关闭 Issue 按标签进行三组分类:

分类组 匹配标签中文平台GitLink / Gitee 匹配标签英文平台GitHub / GitLab 优先级
Bug 修复 缺陷 bug
新功能 功能 enhancement, feature
其他改进 不属于以上两组的所有 Issue 不属于以上两组的所有 Issue

分类规则

  1. 遍历每条 Issue 的标签列表
  2. 首个命中分类组的标签决定该 Issue 所属分类
  3. 一条 Issue 只归属一个分类组(不重复)
  4. 无标签的 Issue 归入"其他改进"

版本命名规则

1. 默认格式: vYYYY.MM.DD (如 v2026.07.10)
2. 去重: 查已有 Release 的 tag_name 列表
   - 当天已有同名 tag →追加序号: v2026.07.10-2, v2026.07.10-3 ...
3. 用户指定版本号时: 直接使用用户指定的版本号 (如 v1.2.0)

工作流Agent 执行步骤)

Step 0确认环境 + 检测后端

# 0.1 检测后端
BACKEND=$(detect_backend)
echo "✓ 后端: $BACKEND"

# 0.2 认证检查
case "$BACKEND" in
  gitlink) gitlink-cli auth status ;;
  github)  gh auth status ;;
  gitlab)  glab auth status ;;
  gitee)   test -n "$GITEE_TOKEN" && echo "Gitee OK" ;;
esac

# 0.3 确认参数
# Agent 需从用户输入或上下文获取:
#   OWNER, REPO, VERSION (可选, 默认日期格式)
echo "仓库: $OWNER/$REPO | 版本: ${VERSION:-auto(vYYYY.MM.DD)}"

Step 1采集数据按后端选命令

case "$BACKEND" in
  gitlink)
    CLOSED=$(gitlink-cli issue +list --owner $OWNER --repo $REPO --state closed --limit 200 --format json)
    OPEN=$(gitlink-cli issue +list --owner $OWNER --repo $REPO --state open --limit 200 --format json)
    RELEASES=$(gitlink-cli release +list --owner $OWNER --repo $REPO --format json)
    ;;
  github)
    CLOSED=$(gh issue list --repo $OWNER/$REPO --state closed --limit 200 --json number,title,labels)
    OPEN=$(gh issue list --repo $OWNER/$REPO --state open --limit 200 --json number,title,labels)
    RELEASES=$(gh release list --repo $OWNER/$REPO --json tagName --limit 50)
    ;;
  gitlab)
    CLOSED=$(glab issue list --repo $OWNER/$REPO --state closed --output json --all)
    OPEN=$(glab issue list --repo $OWNER/$REPO --state opened --output json --all)
    RELEASES=$(glab release list --repo $OWNER/$REPO --output json)
    ;;
  gitee)
    CLOSED=$(curl -s "https://gitee.com/api/v5/repos/$OWNER/$REPO/issues?state=closed&access_token=$GITEE_TOKEN&per_page=200")
    OPEN=$(curl -s "https://gitee.com/api/v5/repos/$OWNER/$REPO/issues?state=open&access_token=$GITEE_TOKEN&per_page=200")
    RELEASES=$(curl -s "https://gitee.com/api/v5/repos/$OWNER/$REPO/releases?access_token=$GITEE_TOKEN")
    ;;
esac

Step 2版本号去重 + 分类

# 2.1 版本号去重
# 从 RELEASES 提取已有 tag_name 列表
# 检查 VERSION 是否冲突,冲突时追加序号

# 2.2 Issue 分类 (按内嵌分类逻辑)
# Bug 修复: 标签含 "缺陷" (GitLink/Gitee) 或 "bug" (GitHub/GitLab)
# 新功能:  标签含 "功能" (GitLink/Gitee) 或 "enhancement"/"feature" (GitHub/GitLab)
# 其他改进: 不属于以上两组的 Issue

# 2.3 统计
BUG_COUNT    ← Bug 修复组 Issue 数量
FEATURE_COUNT ← 新功能组 Issue 数量
OTHER_COUNT  ← 其他改进组 Issue 数量
OPEN_COUNT   ← 开放 Issue 总数

Step 3生成 Release Notes按内嵌模板

Agent 按以下模板生成 Markdown Release Notes。所有数值占位符由 Step 2 计算后填入

# {VERSION} Release Notes

**发布日期:** {NOW_DATE}
**仓库:** {OWNER}/{REPO}

## 本次更新摘要

- 修复缺陷: **{BUG_COUNT}** 项
- 新增功能: **{FEATURE_COUNT}** 项
- 其他改进: **{OTHER_COUNT}** 项
- 仍开放 Issue: **{OPEN_COUNT}** 项

## Bug 修复

{BUG_LIST}
<!-- 格式: - #{number} {subject/title} -->

## 新功能

{FEATURE_LIST}
<!-- 格式: - #{number} {subject/title} -->

## 其他改进

{OTHER_LIST}
<!-- 格式: - #{number} {subject/title} -->

## 仍待处理

{OPEN_LIST}
<!-- 格式: - #{number} {subject/title} (最多10条) -->
<!-- 超过10条: "...及其他 {remaining} 条" -->

---

_本 Release Notes 由 gitlink-release-notes Skill 自动生成_

Step 4dry-run 预览(必须)

Agent 输出完整 Release Notes Markdown附带元信息

## 📦 Release Notes 预览dry-run

> 后端:{BACKEND}
> 仓库:{OWNER}/{REPO}
> 版本号:{VERSION}
> Bug 修复:{count} 项 | 新功能:{count} 项 | 其他改进:{count} 项

{完整 Release Notes Markdown 内容}

⚠️ 涉及写入操作(创建 Release。回复"确认"或"apply"执行。

Step 5创建 Release用户确认后按后端分发

case "$BACKEND" in
  gitlink)
    gitlink-cli release +create --owner $OWNER --repo $REPO \
      --name $VERSION --tag $VERSION --target master \
      --body "$NOTES_MD" --format json
    ;;
  github)
    gh release create $VERSION --repo $OWNER/$REPO \
      --title $VERSION --notes "$NOTES_MD" --target master
    ;;
  gitlab)
    glab release create $VERSION --repo $OWNER/$REPO \
      --name $VERSION --notes "$NOTES_MD" --ref master
    ;;
  gitee)
    curl -X POST "https://gitee.com/api/v5/repos/$OWNER/$REPO/releases?access_token=$GITEE_TOKEN" \
      -d "tag_name=$VERSION" -d "name=$VERSION" -d "body=$NOTES_MD" \
      -d "target_commitish=master"
    ;;
esac

Step 6验证

# 确认 Release 已创建
case "$BACKEND" in
  gitlink) gitlink-cli release +list --owner $OWNER --repo $REPO --format json \
    | jq '.data.releases[] | select(.tag_name=="$VERSION")' ;;
  github)  gh release view $VERSION --repo $OWNER/$REPO ;;
  gitlab)  glab release view $VERSION --repo $OWNER/$REPO ;;
  gitee)   curl -s "https://gitee.com/api/v5/repos/$OWNER/$REPO/releases?access_token=$GITEE_TOKEN" \
    | jq '.[] | select(.tag_name=="$VERSION")' ;;
esac

Release Notes 模板(内嵌)

以下是完整的 Release Notes Markdown 模板:

# {VERSION} Release Notes

**发布日期:** {NOW_DATE}
**仓库:** {OWNER}/{REPO}

## 本次更新摘要

- 修复缺陷: **{BUG_COUNT}** 项
- 新增功能: **{FEATURE_COUNT}** 项
- 其他改进: **{OTHER_COUNT}** 项
- 仍开放 Issue: **{OPEN_COUNT}** 项

## Bug 修复

{BUG_LIST}

## 新功能

{FEATURE_LIST}

## 其他改进

{OTHER_LIST}

## 仍待处理

{OPEN_LIST}

---

_本 Release Notes 由 gitlink-release-notes Skill 自动生成_

安全与写回策略

规则 说明
必走 dry-run Step 4 输出预览,未确认前禁止 发布
必须去重 Step 2.1 检查已有 Release tag避免重复
限流 数据采集 >100 条时,每次 CLI 调用后 sleep 200ms
错误透明 任何 4xx/5xx 必须打印响应体,不要吞错
空数据容错 某分类无数据时输出"无",不跳过章节
仍待处理截断 开放 Issue >10 条时截断,输出"…及其他 N 条"

使用示例

用户输入

帮我发布 Angel123456/gitlink-cli 的 Release Notes

Agent 执行

# Step 0
gitlink-cli auth status

# Step 1
gitlink-cli issue +list --owner Angel123456 --repo gitlink-cli --state closed --limit 200 --format json
gitlink-cli issue +list --owner Angel123456 --repo gitlink-cli --state open --limit 200 --format json
gitlink-cli release +list --owner Angel123456 --repo gitlink-cli --format json

# Step 2: 版本号 v2026.07.10 + 分类 (Bug 修复/新功能/其他)

# Step 3-4: 生成 Release Notes → dry-run 预览

# Step 5 (用户确认后):
gitlink-cli release +create --owner Angel123456 --repo gitlink-cli \
  --name v2026.07.10 --tag v2026.07.10 --target master \
  --body "$NOTES_MD" --format json

# Step 6: 验证
gitlink-cli release +list --owner Angel123456 --repo gitlink-cli --format json \
  | jq '.data.releases[] | select(.tag_name=="v2026.07.10")'

示例 2GitHub 项目(指定版本号)

用户输入

发布 xuanlanwuta/gps_SM v1.2.0 的 Release Notes

Agent 执行

# Step 0
gh auth status

# Step 1
gh issue list --repo xuanlanwuta/gps_SM --state closed --limit 200 --json number,title,labels
gh issue list --repo xuanlanwuta/gps_SM --state open --limit 200 --json number,title,labels
gh release list --repo xuanlanwuta/gps_SM --json tagName

# Step 2: VERSION=v1.2.0 (用户指定) + 去重检查 + 分类

# Step 5 (用户确认后):
gh release create v1.2.0 --repo xuanlanwuta/gps_SM \
  --title v1.2.0 --notes "$NOTES_MD" --target master

Agent 平台兼容性

平台 加载方式 触发方式
OpenClaw workspace/skills/gitlink-release-notes/SKILL.md 自然语言
Claude Code ~/.claude/skills/gitlink-release-notes/SKILL.md 自然语言
Cursor ~/.cursor/skills/gitlink-release-notes/SKILL.md 自然语言 + / 命令
WorkBuddy ~/.workbuddy/skills/gitlink-release-notes/SKILL.md 自然语言
通用 Agent 作为参考文档 按 SKILL.md 流程自取

本 Skill 可独立使用,也可作为 gitlink-community-ops 统一入口 Skill 的子 Skill 被编排调用:

  • 独立触发:用户说"发布 Release Notes"
  • 编排触发:gitlink-community-ops Step 3 指令"加载并执行 gitlink-release-notes"

当作为子 Skill 被调用时Agent 需在上下文中继承 OWNERREPOBACKENDVERSION 参数。