# Cnb Code Commit

> 编写代码、提交并创建 PR。

- Skill: `locusyuri/cnb-code-commit` (Agent Skill)
- Install (CLI): `npx skillmds@latest add locusyuri/cnb-code-commit`
- Raw SKILL.md: https://api.skillmd.com/api/skills/locusyuri/cnb-code-commit/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: locusyuri (https://skillmd.com/u/locusyuri)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/locusyuri/cnb-code-commit

---


# 自动编码并提交推送

根据用户需求选择：
1. 新建分支 -> 编写代码 -> 推送代码 -> 并创建 PR
2. 切换到 PR 源分支 -> 编写代码 -> 推送代码更新 PR

## 步骤

### 1. 理解需求

分析用户输入，明确要修改的文件、功能/Bug 描述、目标分支（PR 的 base）。
如需了解项目结构，直接在当前工作区读取代码。如需了解 PR 变更，可使用 cnb-pr-diff Skill。

### 2. 判断场景并准备分支

根据触发场景切换到正确的工作分支：

- **PR 评论触发**（`CNB_PULL_REQUEST_IID` 存在）：在此分支上继续修改
  ```bash
  git checkout "$CNB_PULL_REQUEST_BRANCH"
  git pull origin "$CNB_PULL_REQUEST_BRANCH"
  ```
- **ISSUE 评论触发** PR 已存在，则切换到 PR 源分支继续开发
  ```bash
  git checkout <PR 源分支名> && git pull
  ```
- **ISSUE 评论触发** PR 不存在，则基于目标分支创建新分支 `auto/{关键词1}-{关键词2}-{4位随机后缀}`
  ```bash
  git checkout -b auto/{关键词1}-{关键词2}-$(openssl rand -hex 2)
  ```
  > ⚠️ **分支命名精简规则**：
  > - `{关键词}`：从 ISSUE 标题/描述中提取 **2 个核心关键词**（名词或动词），用短横线连接，每个关键词不超过 2 个英文单词
  > - `{随机后缀}`：固定 4 位十六进制，用 `$(openssl rand -hex 2)` 生成
  > - **总长度控制**：分支名 `auto/` 之后的部分不超过 20 个字符
  > - **示例**：`auto/optimize-skill-3a7f`、`auto/login-error-b2c1`

### 3. 编写代码

直接在工作区中读取和修改文件，实现代码变更。遵循项目已有的代码风格，确保 import/依赖完整。

**生成/修改 `.cnb.yml` 时的特殊处理**：
- 优先加载 `cnb-pipeline` skill 的 SKILL.md，参照其中的语法文档和校验方式生成并验证配置
- 生成完成后需通过 cnb-pipeline skill 提供的校验方式验证，校验通过后才能提交；校验失败则修复后重新校验

### 4. 验证与提交

```bash
# 查看变更概览
git diff --stat
# 如有构建/lint 命令则执行验证
# 暂存并提交
git add -A
git commit -m "{类型}: {简短描述}"
```

类型：`feat`(新功能) / `fix`(修复) / `refactor`(重构) / `docs`(文档) / `chore`(其他)

### 5. 推送变更并判断是否需要创建 PR

```bash
# 推送当前分支
git push origin HEAD
```

根据推送输出判断是否已有 PR：

- **已有 PR**（输出包含 `There is already has pull request`）：跳过创建 PR，直接在评论中告知用户
- **无 PR**（输出包含 `Create a pull request` 或 `new branch`）：走第 6 步创建 PR

> ⚠️ 只有新建分支且推送后确认无 PR 时，才执行第 6 步。

**示例 1 — 已有 PR，跳过创建：**
```
$ git push origin HEAD
remote:
remote: There is already has pull request for 'fix/optimize-cnb-code-commit-skill' by visiting:
remote:
remote: 	https://cnb.cool/cnb/skills/cnb-skill/-/pulls/140
remote:
To https://cnb.cool/cnb/skills/cnb-skill.git
   e3d8f95..639bd55  HEAD -> fix/optimize-cnb-code-commit-skill

# 输出包含 "There is already has pull request" → 已有 PR，不再创建
# 在评论中告知用户：PR 已存在，代码已推送到 PR #140
```

**示例 2 — 无 PR，需要创建：**
```
$ git push origin HEAD
remote:
remote: Create a pull request for 'fix/optimize-cnb-code-commit-skill' to 'main' by visiting:
remote:
remote: 	https://cnb.cool/cnb/skills/cnb-skill/-/compare/main...fix/optimize-cnb-code-commit-skill
remote:
To https://cnb.cool/cnb/skills/cnb-skill.git
 * [new branch]      fix/optimize-cnb-code-commit-skill -> fix/optimize-cnb-code-commit-skill

# 输出包含 "Create a pull request" → 无 PR，需要走第 6 步创建
```

### 6. 创建 PR

```bash
# 创建 PR, 仅推送后确认无 PR 时执行
cnb pulls post-pull --repo "$CNB_REPO_SLUG" \
  --base "$CNB_DEFAULT_BRANCH" \
  --head "$(git branch --show-current)" \
  --title "{类型}: {简短描述}" \
  --body '<pr-body>'
```

## 注意事项

- 编码前先理解项目结构和代码风格
- 需求不明确或范围过大时，先在评论中确认再执行
- 不修改无关文件，推送前确认变更正确
- 生成/修改 `.cnb.yml` 文件时需使用 cnb-pipeline skill 技能
- 若任务由 Issue 发起，PR body 末尾必须追加 `Ref #<CNB_ISSUE_IID>` (如 `Ref #11`) —— 遗漏会导致 Issue 中看不到关联的 PR；
- `pr-body` 使用单引号包裹传参，可减少不必要的 shell 转义，比如：可直接用**真换行**拼接，而不是 `\n` 字面量。

## 禁止的操作

- ❌ PR 不存在时，禁止在默认分支上修改代码，需新建分支并创建 PR
- ❌ `git push --force`（不要强制推送，除非用户明确要求；如需覆盖可用 `--force-with-lease`）
- ❌ 推送代码后轮询/等待 CI 状态（CI 失败会自动唤起 NPC，无需主动等待）

