Install
openclaw skills install @wlykan/git-workflow项目定制的轻量 Git 工作流助手。仅在用户明确要求写入或同步 README 工作流、创建 feature 分支、查看工作流状态、检查 feature 完成状态时激活。只允许更新 README 托管区块和经确认后创建本地 feature 分支;不执行 commit、stash、rebase、merge、push、tag、发布、分支删除或历史重写。
openclaw skills install @wlykan/git-workflow本 skill 只负责:
README.md 的托管区块。本 skill 不执行 commit、stash、rebase、merge、push、tag、发布、PR/MR 创建、分支删除、分支重命名、force push、reset 或丢弃工作区修改。
除以下两种动作外,所有流程必须保持只读:
遇到异常时只停止、报告和建议,不自动清理、覆盖或恢复 Git 状态。
只有明确的工作流操作指令才能激活本 skill。
| 明确指令 | 允许动作 |
|---|---|
| “把 Git 工作流写入 README” | 预览并确认后写入托管区块 |
| “同步 Git 工作流文档” | 比较模板,预览并确认后更新托管区块 |
| “开始开发用户权限功能” | 生成候选分支并进入创建确认流程 |
| “创建用户权限 feature 分支” | 生成候选分支并进入创建确认流程 |
| “查看 Git 工作流状态” | 执行完全只读的状态检查 |
| “检查当前 feature 的完成状态” | 执行完全只读的完成检查 |
以下表达只做讨论或解释,不修改文件或 Git 状态:
当用户要求执行超出本 skill 边界的 Git 操作时,说明本 skill 是轻量助手,不代替其他 Git 操作流程。
templates/readme-git-workflow.md。README.md、workflows/、guides/、references/ 和 scripts/ 不参与运行时判断。SKILL.md 内维护第二份 README 工作流正文。只有在用户明确要求“写入”或“同步”Git 工作流时才能进入本流程。读取、比较和展示 diff 不等于获得最终写入确认。
目标文件固定为当前目标 Git 仓库根目录的 README.md,托管边界固定为:
<!-- GIT_WORKFLOW_START -->
<!-- 内容来自 templates/readme-git-workflow.md -->
<!-- GIT_WORKFLOW_END -->
模板文件本身包含完整的开始和结束标记。写入 README 时使用完整模板,不额外嵌套第二层标记。
git rev-parse --show-toplevel 定位目标仓库根目录;失败时停止。templates/readme-git-workflow.md。README.md;文件不存在时记录为“待创建”,不立即写入。GIT_WORKFLOW_START 和 GIT_WORKFLOW_END 标记数量。按以下情况处理:
| 标记状态 | 处理方式 |
|---|---|
| 开始 0、结束 0,且无同名非托管章节 | 计划在 README 末尾追加完整模板 |
| 开始 1、结束 1,且顺序正确 | 只比较并替换完整托管区块 |
| 开始 1、结束 0,或开始 0、结束 1 | 停止,展示残缺标记行号 |
| 任一标记超过 1 个 | 停止,展示所有标记行号 |
| 开始标记位于结束标记之后 | 停止,报告标记顺序错误 |
| 托管区块外已有“Git 工作流”标题 | 停止,提示可能产生重复章节 |
只有用户明确要求开始某项新需求或创建 feature 分支时才能执行本流程。
origin/main。生成规则:
feature/ 前缀。PROJ-123 转为 proj-123。示例:
开发用户权限功能
-> feature/user-permission
PROJ-123 登录超时处理
-> feature/proj-123-login-timeout
最终名称必须通过以下检查,其中 $branchName 表示已经替换为实际候选值的 PowerShell 变量:
git check-ref-format --branch $branchName
依次执行并解释结果:
git rev-parse --show-toplevel
git status --porcelain=v2 --branch
git status --porcelain
git status --porcelain 有任何输出时,说明工作区、暂存区或未跟踪文件不干净,停止创建。检查是否存在进行中的 Git 操作:
$mergeHead = git rev-parse --git-path MERGE_HEAD
$cherryPickHead = git rev-parse --git-path CHERRY_PICK_HEAD
$rebaseMerge = git rev-parse --git-path rebase-merge
$rebaseApply = git rev-parse --git-path rebase-apply
Test-Path -LiteralPath $mergeHead
Test-Path -LiteralPath $cherryPickHead
Test-Path -LiteralPath $rebaseMerge
Test-Path -LiteralPath $rebaseApply
任一路径存在时停止并报告具体操作,不自动 abort。
当基线保持为默认值时,获取并验证最新 origin/main:
git fetch origin main
git rev-parse --verify 'origin/main^{commit}'
git log -1 --format='%h %s' origin/main
origin、main 或访问权限不存在时停止并报告原始错误。main 代替未验证的 origin/main。如果用户改为其他远程基线,先 fetch 对应 remote 和 branch,再验证对应远程 ref;如果改为本地基线,只验证该 ref 能解析为 commit。所有基线都必须展示实际 SHA 和最近一条提交信息。
检查同名分支:
git show-ref --verify --quiet "refs/heads/$branchName"
git ls-remote --exit-code --heads origin "refs/heads/$branchName"
执行创建前必须展示:
即将创建 feature 分支
需求:PROJ-123 登录超时处理
候选分支:feature/proj-123-login-timeout
基线:origin/main
基线提交:a1b2c3d fix(auth): 修复登录状态刷新
工作区:干净
进行中的 Git 操作:无
同名分支:本地无、远程无
等待用户确认,或者接受用户对候选分支名和基线的修改。修改后返回校验阶段。
执行前把变量替换为已验证的实际值,不执行包含未解析占位符的命令。
默认基线:
git switch --no-track -c $branchName origin/main
用户修改后的基线:
git switch --no-track -c $branchName $baseRef
创建成功后只报告:
本流程完全只读,不自动 fetch。涉及远程分支的结论使用本地缓存 remote-tracking ref,并明确提示可能不是远程最新状态。
git rev-parse --show-toplevel
git branch --show-current
git rev-parse --short HEAD
git log -1 --format='%h %s' HEAD
git status --porcelain=v2 --branch
git status --porcelain
git show-ref --verify --quiet refs/remotes/origin/main
git rev-list --left-right --count origin/main...HEAD
git rev-parse --abbrev-ref --symbolic-full-name '@{upstream}'
解释规则:
git branch --show-current 无输出时表示 detached HEAD。git status --porcelain 无输出时表示工作区干净。origin/main 时,基线和领先/落后显示为“不可用”,不自动 fetch。git rev-list --left-right --count origin/main...HEAD 的第一个数字是当前分支落后 origin/main 的提交数,第二个数字是领先提交数。feature/<kebab-case-description>,并检查缓存的 refs/remotes/origin/<当前分支> 是否存在。Git 工作流状态
当前分支:feature/proj-123-login-timeout
HEAD:a1b2c3d fix(auth): 修复登录状态刷新
工作区:干净
基线:origin/main @ d4e5f6a
相对基线:领先 3,落后 1
Upstream:未设置
分支命名:通过
进行中的 Git 操作:无
同名缓存远程分支:无
远程引用:使用本地缓存,可能不是远程最新状态
字段不可用或存在异常时保留该字段并说明原因,不静默省略。
本流程完全只读,不自动 fetch。涉及 origin/main 的结论必须注明使用本地缓存 remote-tracking ref。
先执行“工作流状态检查”,然后执行:
git log --format='%h %s' origin/main..HEAD
git diff --name-status origin/main...HEAD
git rev-list --count origin/main..HEAD
以下任一情况存在时,结论为“存在阻断项”:
origin/main,或者无法计算共同基线;feature/*。origin/main;提交规范处理规则:优先读取仓库已有的 commitlint、CONTRIBUTING 或明确文档;仓库没有明确规范时只列出提交信息,不自行发明规则或判为不合规。
以下事项必须标记为“未验证”,不能根据本地 Git 状态推断完成:
最终结论只能使用:
不得输出“可以发布”“验证通过”或其他超出证据范围的结论。
| 异常 | 处理方式 |
|---|---|
| 不在 Git 仓库 | 停止,要求用户切换到目标仓库 |
| 工作区、暂存区或未跟踪文件不干净 | 停止创建,只提示用户自行 commit 或 stash |
| detached HEAD | 状态中警告;创建 feature 时停止 |
| merge、rebase 或 cherry-pick 进行中 | 停止,不自动 abort |
| 本地同名分支存在 | 停止,建议切换或修改候选名称 |
| 远程同名分支存在 | 停止,提示可能已有协作者使用 |
origin/main 不存在 | 展示可用 remote 和默认分支,请用户选择基线 |
| fetch 失败 | 保持当前分支不变,报告 Git 原始错误 |
| README 标记残缺、重复或乱序 | 展示标记行号,不自动修复 |
| README 存在同名非托管章节 | 停止,提示用户决定是否迁移 |
| 分支创建失败 | 报告 Git 原始错误,不 reset、不删除、不尝试其他基线 |
任何建议都必须与已经执行的动作分开表述,不能把建议伪装成已完成结果。
/dev/null、Bash for ...; do、Bash 数组或 Bash 条件表达式。&& 或 || 串联带状态修改的命令。Test-Path -LiteralPath。@{upstream} 或 ^{commit} 时使用单引号,避免 PowerShell 解析。