--- name: add-feature description: 端到端的 GitHub feature 开发工作流。接受 feature 简述或 issue 编号,从澄清需求到建分支、设计、实现、测试、推送、开 PR、处理评审、合并的完整流程。当用户请求"新增功能 X"、"实现 feature Y"、"给我加一个 ..."等端到端特性开发任务时触发。 --- # add-feature — 端到端 Feature 开发流程 以 `$1` 作为 feature 简述或 issue 编号。严格按以下顺序执行,任何一步失败都先修复再进下一步,**不要跳步**。 ## 0. 解析 `$1`,确定并校验分支 slug `$1` 可能是以下两种之一,**不要**把它直接拼进 git 命令: ### 0.1 分类 1. **纯数字**(`$1` 匹配 `^[0-9]+$`):视为 issue 编号。 - `ISSUE_NUM="$1"` - `BRANCH_SLUG="issue-$ISSUE_NUM"` 2. **其他任何形式**(自由文本、中文、含空格/特殊字符):视为自由描述。 - 由你(Claude)基于描述生成一个 **ASCII kebab-case slug** 候选: - 全小写,仅保留 `[a-z0-9-]`,空格与标点转成 `-`。 - 中文先翻成对应英文概念再缩短,**不要**用拼音堆砌。 - 长度 2-5 个单词(不超过约 40 字符),语义清晰。 - 例:`"房间邀请链接支持过期时间"` → `room-invite-expiry`。 - 把候选 slug 念给用户确认,允许用户给出替代值。 - 得到最终值:`BRANCH_SLUG="<最终 slug>"` ### 0.2 强制校验(无论哪条分类,都必须跑一次) 在进入第 3 步之前,用以下 bash 校验 `BRANCH_SLUG`。**不满足条件必须停住**,让用户改,或你自己改写后重新走第 0.1 步: ```bash # 规则:全小写、首尾是字母或数字、中间允许 [a-z0-9-]、总长 2-40、不含连续 '-'、不含 '..' 或 '/' if ! printf '%s' "$BRANCH_SLUG" | grep -Eq '^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$'; then echo "rejected: slug must match ^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$ — got: $BRANCH_SLUG" >&2 return 1 2>/dev/null || exit 1 fi if printf '%s' "$BRANCH_SLUG" | grep -Eq -- '--|\.\.'; then echo "rejected: slug must not contain '--' or '..' — got: $BRANCH_SLUG" >&2 return 1 2>/dev/null || exit 1 fi ``` 若 `$1` 是纯数字分类,`BRANCH_SLUG="issue-$ISSUE_NUM"` 天然满足校验。 ### 0.3 使用约束 最终分支名统一为 `feat/$BRANCH_SLUG`。后续命令一律使用**带双引号**的 `"feat/$BRANCH_SLUG"` 变量,**严禁**: - 把 `$1` 原样拼进 `git switch -c` / `git push` / `gh pr create` 等命令。 - 绕过 0.2 的校验,即便"看起来是对的"也不行。 - 在校验失败后继续硬闯,而不是回到 0.1 重新取值。 ## 1. 澄清需求与边界 - 如果 `$1` 是 issue 编号:`gh issue view "$ISSUE_NUM"` 读完正文和全部评论。 - 如果 `$1` 是自由文本描述:先复述你对需求的理解,把以下问题问清楚再动手: - **用户故事**:谁在什么场景下要用?替代的现状是什么? - **验收标准**:golden path 和边界情况各是什么?如何判定"完成"? - **跨包影响**:是否涉及 `packages/protocol/` 的类型、`extension/` 的消息或 `server/` 的路由? - **范围外**:有哪些相关但**本次不做**的事? - 需求不清时**先向用户确认**,不要替用户拍板。 ## 2. 设计轮廓(触及多文件或跨包时必做) 动笔前简要回答: - 新增/修改的**数据契约**(`ClientMessage` / `ServerMessage` / 领域类型)在哪里落地?如果有新字段或新消息,必须先改 `packages/protocol/`,再被 `extension/` 和 `server/` 消费。 - 新增的**控制器/模块**归属:参照 CLAUDE.md 里 `background/` 各 controller 的职责划分,不要把"模板 + DOM + 业务规则 + 消息派发"塞进同一个文件。 - **状态机/生命周期**:新状态字段要同步考虑 reset/cleanup 路径,避免遗漏姊妹状态。 - **URL 规范化**:如果涉及共享视频 URL,继续走 `normalizeSharedVideoUrl`,不要在调用点各自处理。 - **服务端环境变量**:集中在 server config 层解析,不要散落。 复杂度高时先和用户同步设计再动手。 ## 3. 创建 feature 分支(严禁在 main 上工作) ```bash git switch main && git pull --ff-only git switch -c "feat/$BRANCH_SLUG" ``` - 开工前确认当前分支;如在 `main`/`master`,**立即**切到 feature 分支。 - 分支名一律使用第 0 步确认过的 `$BRANCH_SLUG`,绑定 issue 时形如 `feat/issue-123`,自由文本时形如 `feat/room-invite-expiry`。 - 创建后 `git rev-parse --abbrev-ref HEAD` 再确认一次。 ## 4. 实现 + 测试 - **协议先行**:先在 `packages/protocol/` 增/改类型与类型守卫,导出走包根。 - 再改消费方(`extension/` / `server/`),保持分层清晰。 - 同步新增或修改: - 类型守卫与运行时校验(消息边界 + payload)。 - 单元测试覆盖 golden path 和边界情况。 - 如涉及重构刷新的公共领域,回归测试。 - **状态新增**:为每个新字段同步列出 reset/cleanup 点并验证。 - **异步 Redis/锁操作**:务必 `await` 并包裹 `try/catch`。 - **前端改动**:按 CLAUDE.md 要求,启动 dev server 在浏览器里手测 golden path 和边界,观察其它功能是否回归;类型检查和测试只验证代码正确性,不验证功能正确性。 ## 5. 提交前的预提交检查(强制) ```bash npm run format:check && npm run lint && npm run typecheck && npm run build && npm test && npm run audit ``` 任一项失败就先修复,**不要跳过**。 `npm run audit` 不被 `npm test` 覆盖,是 CI `verify` job 的同一道依赖闸门,且会在 本地毫无改动的情况下因新公告而变红——所以要在推送前跑,而不是等 CI 红了再补。不 适用于本仓库的条目写进 `audit-allowlist.json`,附理由和**必填的过期日期**。 ## 6. 提交、推送、开 PR ```bash git add <具体文件> # commit message:绑定 issue 时带 "(#$ISSUE_NUM)",自由文本时不带编号 git commit -m "feat: <简明的'为什么/带来什么价值'>" git push -u origin "feat/$BRANCH_SLUG" gh pr create --title "feat: ..." --body "$(cat <<'EOF' ## Summary - 新增/变更点 1 - 新增/变更点 2 ## Test plan - [ ] 单元测试 - [ ] 手动验证(golden path) - [ ] 手动验证(边界情况) EOF )" ``` - Conventional Commits:新能力用 `feat:`;行为不变的结构改动用 `refactor:`,不要藏在 `feat:` 里。 - 一个可评审单元一次提交;大特性拆成多个逻辑提交。 - 严禁 `git add -A` / `git add .`。 ## 7. 等 Codex 评审,处理**所有**相关路径 - 不只是修被标的那一行,对整类问题审视所有相关代码路径。 - 自审一轮:`grep` 被标关注点相关的调用点和姊妹函数,逐一确认修复已应用或显式不需要。 - 处理完再跑第 5 步完整预提交序列。 - 修复后再推,等下一轮评审至通过。 ## 8. 合并并清理 ```bash gh pr merge --squash --delete-branch git switch main && git pull --ff-only ``` - 只有 CI 绿且评审通过后才合并。 - 如绑定 issue,合并会经由 `Closes #NNN` 自动关闭。 - 除非用户明确授权,否则 `gh pr merge` 前先向用户确认。 ## 硬性规则 - **严禁直接推 main/master**。 - **严禁跳过** `format:check` / `lint` / `typecheck` / `build` / `test` / `audit`。 - **严禁** `--no-verify` / `--no-gpg-sign` 绕过钩子或签名。 - **严禁** `git add -A` / `git add .`。 - **不要越界**:不要搭建"未来可能用到"的抽象;三行相似代码胜过过早抽象。 - **不要越权**:没明确要求就不要重构、清理无关代码、改 CI/CD 或依赖版本。