Install
openclaw skills install @wlykan/gitcommitUse when the user explicitly asks to prepare, review, or create a Git commit, including "提交", "提交代码", "帮我提交", "commit", "git commit", "确认提交", or requests a commit message.
openclaw skills install @wlykan/gitcommit基于仓库规则和全部未提交改动生成 Conventional Commit 计划。核心原则是:先按业务意图形成可独立审查、可独立回滚的原子变更,再用该组的主要意图确定 type。
Skill 首次被调用时只执行准备阶段:读取、分析、分组并展示提交消息。完成展示后必须停止,等待用户确认。
git add、git commit、git reset、git restore 或其他写操作。先确认仓库根目录、当前分支和 Git 操作状态。检查是否存在未完成的 merge、rebase、cherry-pick、revert 或冲突;存在时停止并说明,不能生成可执行提交计划。
收集全部非忽略改动,而不是只看暂存区:
git rev-parse --show-toplevel
git status --short --branch
git status --porcelain=v1 -z
git diff --cached --name-status
git diff --name-status
git ls-files --others --exclude-standard
随后读取:
如果 staged、unstaged、untracked 都为空,报告“没有可提交的改动”并停止。不得使用 git diff HEAD~1 代替当前改动。
读取与改动文件适用的仓库规则,优先级如下:
AGENTS.md、CLAUDE.md;.github/COMMIT_CONVENTION.md、CONTRIBUTING.md、README 中的提交约定;.commitlintrc*、commitlint.config.*、package.json 中的 commitlint 配置;git config --get commit.template 指向的模板和相关 commit hook;git log --no-merges -20 --pretty=format:%s;报告实际采用了哪些规则来源。仓库规则不能覆盖确认门禁和敏感文件保护。
建立完整改动清单。按去重后的仓库相对路径计数:同一路径同时包含 staged 和 unstaged 内容时只计一次;rename 作为一个改动条目记录旧、新路径。每个改动条目必须且只能出现在以下一个位置:
完成分组前核对:
检测到的改动路径数 = 已归组路径数 + 排除路径数 + 待决定路径数
如果等式不成立、路径重复归组、untracked 文件尚未检查或存在无法读取的内容,不得声称计划完成。
先判断每项改动解决的业务问题或交付目标,再形成原子组:
feat 或同为 fix 不代表属于同一组;业务意图不同仍要拆分。*.spec.* 或 *.md 就把它从所属功能组拆走。每个原子组应满足:有一个清晰意图,可以独立说明、独立审查,并能安全地独立回滚。
先形成原子组,再选择 type。项目约定优先;没有约定时使用:
| Primary intent | Type |
|---|---|
| 增加或扩展用户可用能力 | feat |
| 修复错误行为 | fix |
| 只调整内部结构且不改变外部行为 | refactor |
| 主要改善性能 | perf |
| 只新增或修改测试 | test |
| 只修改文档 | docs |
| 只修改格式且不改变语义 | style |
| 构建系统、构建依赖或打包 | build |
| CI/CD 配置 | ci |
| 其他维护工作 | chore |
| 回退既有提交 | revert |
不要把含义不明确的组自动降级为 chore;说明歧义并等待用户决定。
Scope 遵循项目历史和 commitlint 规则;否则选择最能表示业务模块的简短名称。跨多个无共同模块的改动省略 scope。
格式:
<type>[optional scope][optional !]: <subject>
[optional body]
[optional footer]
默认规则:
Refs #123、Fixes #456;! 和 BREAKING CHANGE: ...,并在计划中醒目标记风险。消息语言优先遵循仓库规则,其次参考最近非 merge 提交;无法判断时默认中文。
按以下结构展示,不输出依赖特定 shell 的 Bash HEREDOC:
提交计划
仓库:<name>
分支:<branch>
规则来源:<files/config/history>
提交组 1:<业务意图>
文件:
- <status> <path>
Commit message:
<完整消息>
分组原因:<为什么这些文件构成一个原子变更>
风险或待决定项:<无,或具体说明>
覆盖核对:
- 检测到:N
- 已归组:N
- 排除:N
- 待决定:N
回复“确认提交”后执行;也可以要求调整分组或消息。
存在多个组时逐组展示,并说明建议提交顺序。展示完成后停止,不执行任何 Git 写操作。
收到有效确认后:
git add -A -- <exact-paths> 精确暂存,不使用 git add .。rename 必须同时包含旧、新路径。git commit;git commit,使用 git commit --only -- <current-group-exact-paths> 隔离当前组;git commit -F - 配合当前 shell 的标准输入方式。--only,还要比较其余 staged diff 与提交前快照,确认其他组的暂存内容没有丢失或改变。如果某组失败,停止后续提交并报告已经成功的提交和当前仓库状态;不得自动 amend、reset 或回滚。
.env*、credentials、secrets、*.pem、*.key、令牌、证书)默认排除;只有用户明确点名包含后才可暂存。--no-verify,除非用户明确要求并已获准。准备阶段只有在以下条件全部满足时才完成:
执行阶段只有在每个成功提交都完成 hash/文件验证,并报告剩余工作区状态后才完成。
以下文件共同交付“用户登录”能力:
src/auth/login.ts
tests/auth/login.spec.ts
docs/auth.md
它们应形成一个原子组,而不是拆成 feat、test、docs 三个提交:
feat(auth): 增加用户登录能力
实现登录认证及回归测试,并补充使用说明。