local-link/skills/release-project/SKILL.md
--- name: release-project description: 项目版本发布流程指导,帮助用户完成版本规划、Changelog 管理、版本号升级、Git 标签创建和 npm 首次发布准备。Use when: (1) 用户需要发布新版本 (2) 需要创建版本发布流程 (3) 需要管理版本号和 Changelog (4) 需要自动化版本发布 (5) 需要识别分支模型并确保发版分支同步 (6) 首次 npm 发布准备 argument-hint: [--changelog-only] [--sync-to <target-branch>] --- # Release Project 指导项目版本发布的完整流程,从版本规划到 Git 标签创建。 ## 前置要求 - 当前仓库使用 Git 进行版本控制 - 项目配置了 `package.json`(Node.js 项目)或相应的版本管理文件 - 分支模型可识别(第 1 步调用 `recognize-codebase-branch-flow` 技能自动判定 trunk-based 或 release-branch) ## C
npx skillsauth add lionad-morotar/simple-local-llm-server local-link/skills/release-projectInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
指导项目版本发布的完整流程,从版本规划到 Git 标签创建。
package.json(Node.js 项目)或相应的版本管理文件recognize-codebase-branch-flow 技能自动判定 trunk-based 或 release-branch)传入 --changelog-only 时,仅执行「3. Changelog 整理」中的 [Unreleased] 维护,跳过用户确认、不升级版本号、不打 Git 标签、不推送,整理完即结束。把“整理变更条目”与“真正发版”解耦,供自动化流程(如 flow-north-star-loop)在开发过程中增量沉淀 changelog。
该模式下:
## [Unreleased] 区块(遵循 Keep a Changelog 分类、正交合并、[internal] 标记)--sync-to <target-branch>)传入 --sync-to release 时,仅执行分支同步,跳过版本规划、Changelog 整理、版本号升级、Git 标签创建和 npm 发布。用于把当前分支(如 dev)的最新内容同步到目标分支(如 release),以便 Jenkins 等 CI/CD 触发运行。
该模式下:
git fetch 确保判断准确# 当前分支领先目标分支(ff 可能)
AHEAD=$(git log --oneline <target>..<current> | wc -l)
# 目标分支领先当前分支
BEHIND=$(git log --oneline <current>..<target> | wc -l)
| 状态 | 决策 |
|-----|------|
| AHEAD > 0 && BEHIND == 0 | 当前分支是目标分支的祖先,执行 --ff-only 同步 |
| AHEAD == 0 && BEHIND > 0 | 目标分支已经领先,无需同步,直接结束 |
| AHEAD > 0 && BEHIND > 0 | 两分支分叉,按项目 merge style 执行 --no-ff merge 或询问用户 |
| AHEAD == 0 && BEHIND == 0 | 两分支一致,无需同步,直接结束 |
git checkout <target-branch>
git merge <source-branch> --ff-only
git push origin <target-branch>
分叉时按项目 merge style 选择:
git merge <source-branch> --no-ff -m "chore: sync <source> into <target>"--no-ff merge 还是先把源分支 rebase 到目标分支后再同步git push origin <source-branch>┌─────────────────┐
│ 0. 分支检查 │
│ (识别分支模型, │
│ 确保发版分支) │
└────────┬────────┘
▼
┌─────────────────┐
│ 1. 版本规划 │
└────────┬────────┘
▼
┌─────────────────┐
│ 2. Changelog │
│ 整理 │
└────────┬────────┘
│
▼
┌──────────┐
│ 用户确认 │
└────┬─────┘
│ 确认后继续
▼
┌─────────────────┐
│ 3. 版本号升级 │
└────────┬────────┘
▼
┌─────────────────┐
│ 4. Git 提交 │
│ & 标签 │
└────────┬────────┘
▼
┌─────────────────┐
│ 5. 首次发布 │
│ 检测&准备 │
└─────────────────┘
目标:识别项目分支模型,据此选择发版路径,并确保发版分支干净且与远程同步。
自动调用 recognize-codebase-branch-flow 技能分析当前项目分支模型,获取其 branch_model 判定:
明确映射(直接走对应路径,无需询问):
| recognize 输出 | 发版路径 |
|---------------|---------|
| github flow | Trunk-based(main 直接打 tag) |
| gitflow | Release-branch(develop → release → main) |
模糊映射(gitlab flow / 无显著模型 / 自建模式)或 recognize 调用失败:自动执行轻量探测——
release/develop 分支:git branch -a --list '*release*' '*develop*'git tag -l 'v*' --sort=-v:refname | head -1 → git branch --contains <tag>探测有定论则自动选路径;探测仍无定论才询问用户。
主分支(main/master)直接打 tag 发版:
确认在主分支:
git branch --show-current
不在主分支则 git checkout main
拉取最新(仅快进):
git pull --ff-only origin main
验证工作区干净:git status,确保无未提交变更
有长期 release 分支用于发版准备:
检查当前分支:git branch --show-current,不在 release 则 git checkout release
确保 release 分支最新:
情况 A:开发在 develop/feature 分支
git fetch origin
git merge origin/develop --no-ff -m "chore: merge develop into release"
情况 B:已在 release 分支开发
git pull origin release
验证工作区干净:git status,确保无未提交变更
仅当 1.1 映射结果需要询问时,使用 Ask 工具确认:
X,应走 [Trunk-based/Release-branch] 路径,是否正确?"当发布的版本是 prerelease(版本号含 -,如 0.4.0-alpha.2)时:
main/master/release),直接在该分支上打 tag 发版,不合并回 main。git push origin <当前分支> --tags。只有在发 stable 版本时,才需要把变更合并到 main(trunk-based)或 release(gitflow)后再打 tag。
当项目存在长期 test 分支作为自动化开发循环(flow-north-star-loop)的集积分支时,发版前需先把 test 上已通过 e2e 验证的变更合并到发版分支——这填补 nsl-loop 产出(test)与发版(main 打 tag)之间的缝隙:
git branch --list testgit log --oneline <发版分支>..test(若含 feat/nsl-epic/* 章鱼合并痕迹,确认是 nsl 产物)git checkout main && git merge --no-ff test -m "chore: merge test into main for release"release 分支--sync-to 分支同步当传入 --sync-to <target-branch> 时,本技能进入纯分支同步模式,不执行版本号、Changelog、tag 等发版操作。
记录源分支:
SOURCE=$(git branch --show-current)
TARGET=<用户传入的目标分支>
拉取远端最新状态:
git fetch origin
检查目标分支是否存在:
git branch --list "$TARGET"git ls-remote --heads origin "$TARGET"git checkout -b "$TARGET"确保远端 tracking 存在:
git branch -u origin/"$TARGET" "$TARGET"git checkout -t origin/"$TARGET"计算相对位置:
AHEAD=$(git rev-list --count "$TARGET".."$SOURCE")
BEHIND=$(git rev-list --count "$SOURCE".."$TARGET")
根据相对位置执行同步:
A)AHEAD > 0 && BEHIND == 0(可 fast-forward)
git checkout "$TARGET"
git merge "$SOURCE" --ff-only
git push origin "$TARGET"
B)AHEAD == 0 && BEHIND > 0(目标分支已领先)
"$TARGET" 已领先 "$SOURCE" $BEHIND 个提交,无需同步C)AHEAD == 0 && BEHIND == 0(已一致)
"$SOURCE" 与 "$TARGET" 已经一致D)AHEAD > 0 && BEHIND > 0(分叉,无法 ff)
recognize-codebase-branch-flow 识别分支模型github flow / trunk-based:默认 git merge "$SOURCE" --no-ff -m "chore: sync $SOURCE into $TARGET"--no-ff merge 还是 rebase 后再同步git push origin "$TARGET"切回源分支:
git checkout "$SOURCE"
--sync-to 与 --changelog-only 不能同时使用。若同时传入,向用户确认以哪个为准,或默认 --sync-to 优先并报告冲突。
确定版本类型(遵循 Semantic Versioning):
| 版本类型 | 适用场景 | 版本变化示例 |
|---------|---------|-------------|
| patch | Bug 修复、小幅改动 | 1.0.0 → 1.0.1 |
| minor | 新功能(向后兼容) | 1.0.0 → 1.1.0 |
| major | 破坏性变更 | 1.0.0 → 2.0.0 |
遵循 Keep a Changelog 规范。
YYYY-MM-DD# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- 新添加的功能
### Changed
- 对现有功能的变更
### Deprecated
- 已经不建议使用,即将移除的功能
### Removed
- 已经移除的功能
### Fixed
- 对 bug 的修复
### Security
- 对安全性的改进
## [1.0.0] - 2024-01-15
### Added
- 正式发布版本
| 类型 | 说明 |
|-----|------|
| Added | 新添加的功能 |
| Changed | 对现有功能的变更 |
| Deprecated | 已经不建议使用,即将移除的功能 |
| Removed | 已经移除的功能 |
| Fixed | 对 bug 的修复 |
| Security | 对安全性的改进 |
在文档最上方维护 ## [Unreleased] 区块:
对于因重大 bug 或安全原因撤下的版本:
## [0.0.5] - 2014-12-13 [YANKED]
更新 Changelog 后,必须等待用户确认再继续下一步(--changelog-only 模式下跳过此确认,自动结束流程,不执行后续版本号升级与 Git 提交):
检查清单:
YYYY-MM-DD)[Unreleased] 区块- 增加交互式 pager 与 - 修复 pager footer 渲染异常 应合并为 - 为 supports/list 增加交互式 pager[internal]:维护脚本、CI、内部工具、模式生成等不向最终用户暴露的条目,前缀 [internal]
- [internal] watch-patterns 重启时通过持久化 hash 缓存避免全量重新上传根据项目类型选择升级方式:
单包项目:
# 使用 npm version
npm version [patch|minor|major]
# 或使用 standard-version
npx standard-version --release-as [patch|minor|major]
Monorepo 项目:
npx changeset versionnpx lerna version [patch|minor|major]版本号同步:
Prerelease 版本(版本号含 -,如 alpha/beta/rc):
npm version prerelease --no-git-tag-version(如 alpha.2 → alpha.3);误用 npm version patch 会跨出该系列直奔 stable--no-git-tag-version 让版本号与 CHANGELOG 进同一个 release: commit,避免 npm version 自动产生只含 package.json 的孤点 commit标准发布提交:
# 提交所有变更
git add .
git commit -m "release: v<版本号>"
# 创建标签
git tag -a "v<版本号>" -m "Release v<版本号>"
# 推送到远程(stable 版本通常推 main;alpha/prerelease 直接推当前 feature 分支)
git push origin main --tags
# 或
git push origin <当前分支> --tags
触发时机:完成 "Git 提交 & 标签" 后
# 统计符合 v-* 格式的标签数量
git tag -l "v*" | wc -l
如果标签数量 == 1(意味着这是第一次发布):
使用 Ask 工具询问用户:
"检测到这是您第一次发布此项目。是否需要我协助进行 npm 发布准备工作?包括:
- 从 GitHub 读取您的个人信息(author、repository 等)
- 完善 package.json 字段(keywords、license、bugs、homepage 等)
- 配置 publishConfig(registry、access)"
如果用户确认需要准备:
获取 GitHub 用户信息:
gh api user -q '.login, .name, .email, .html_url'
完善 package.json 字段:
{
"author": "用户名 <邮箱> (个人主页)",
"repository": {
"type": "git",
"url": "git+https://github.com/用户名/仓库名.git"
},
"bugs": {
"url": "https://github.com/用户名/仓库名/issues"
},
"homepage": "https://github.com/用户名/仓库名#readme",
"keywords": ["keyword1", "keyword2", "keyword3"],
"license": "MIT",
"publishConfig": {
"registry": "https://registry.npmjs.org/",
"access": "public"
}
}
提交发布准备变更:
git add package.json
git commit -m "chore: release prepare"
验证 package.json 格式:
node -e "JSON.parse(require('fs').readFileSync('./package.json'))" && echo "格式正确"
chore: release preparenpm publish --dry-run 预览发布内容根据项目需求,可创建发布脚本 scripts/release.sh:
核心步骤(按需求选择):
Dry-run 模式:
添加 --dry-run 参数预览变更,不实际执行。
| 场景 | 推荐工具 |
|-----|---------|
| 简单项目 | npm version |
| 需要自动生成 Changelog | standard-version / semantic-release |
| Monorepo | changesets / lerna |
| 严格流程控制 | 自定义脚本 |
prepublishOnly 钩子或 test:unit)test:e2e)release: v<版本号>)v<版本号>)chore: release prepare)npm publish --dry-run 验证tools
理解用户意图;listen 模式通过 grill-me 深挖任务并归档经验
development
给 VSCode(Insiders/Stable) 内置 ripgrep 加 5s 超时包装,防止搜索卡死吃满 CPU。--on 包装(幂等) / --off 还原 / 不带参数查状态。Use when VSCode 搜索卡死、rg 进程占满 CPU,或 VSCode 更新后超时保护失效需要重包。
development
为指定项目创建完全隔离的 hapi(Claude Code On the Go)实例,包括独立数据目录、LaunchAgent 持久化、zsh wrapper 和 app.hapi.run 直连 URL。与全局 ~/.hapi 互不干扰。
development
关闭承载当前 Claude Code 会话的宿主(VSCode 窗口或其终端面板),连同 claude 一起退出。通过 close-host-window 扩展触发:先 SIGTERM claude(走完 SessionEnd hooks)再关 host,不抢焦点、不丢 hooks。--host vscode 关窗口、--host terminal(默认)只关终端面板。Use when 任务结束要随宿主退出,或需精确关闭某 claude 终端所在窗口/面板。