en un clic
en un clic
| name | feature-development-workflow |
| description | AgentBay CLI 需求开发全流程规范(分支管理、推送、提交、PR),不含具体需求内容 |
规定 agentbay-cli 在接到任何新需求时的标准开发流程,覆盖从拉分支、本地开发、构建验证、提交、推送到提 PR 的全链路操作规范。
本 skill 不包含任何具体需求的代码实现细节,仅约束流程本身。
当用户提出以下诉求时触发:
本项目只保留两个远程,不使用 upstream(个人 fork):
| Remote | 地址 | 用途 |
|---|---|---|
origin | git@gitlab.alibaba-inc.com:InnoArchClub/agentbay-cli.git | 内网代码仓,归档/协作/CI |
aliyun | git@github.com:aliyun/agentbay-cli.git | 对客真实代码仓,合入主线的目标 |
验证命令:
git remote -v
# 必须只有 origin 和 aliyun,不允许出现 upstream
如出现多余 remote:
git remote remove <name>
为让每个需求都有"需求 → 设计 → 代码 → 提交 → PR → 发布"的完整追溯链,启动任何新需求前必须二选一建立变更档案,两条路径都是强制的,目的一致 — 在 Git 仓库内留下可审阅的档案:
| 路径 | 触发场景 | 产物位置 | 备注 |
|---|---|---|---|
| A. Qoder Quest Mode | 通过 ⌘ E 进入 Quest 模式,在 Design 阶段让 AI 生成 Spec,Review 后点 Download | .qoder/specs/<feature>.md(Qoder 客户端 Download 默认写盘位置,零配置) | 推荐用于复杂需求;Spec 可与 AI 协同编辑;文件默认 untracked,需 git add 入库 |
| B. 手动 CR 目录 | 未启用 Quest Mode / 轻量需求 / 已有外部设计稿需沉淀 | .qoder/changes/CR-<YYYY-MM-DD>-<feature-name>/ | 包含 spec.md / design.md / tasks.md / decisions.md / test-plan.md / rollback.md / trace.md 等 |
核心规则:
.qoder/specs/<feature>.md 由 Qoder 在点 Download 后自动落盘,必须 git add 纳入版本库,避免档案与代码脱节.qoder/changes/ 下建 CR 目录,命名严格遵守 CR-<YYYY-MM-DD>-<feature-name> 格式,与 feat 分支名强关联trace.md / 对应 Spec 中登记:feat 分支名、关键 commit SHA、推送目标 remote、PR 链接、合并 commit、release tag⚠️ 铁律:此 Phase 产出之前,不允许进入 Phase 1 拉分支。
选择一条路径建立档案:
路径 A · Quest Mode(推荐)
⌘ E 打开 Quest 面板New Task → 勾选相关文件作为 Context → 粘贴需求描述 → 回车(不要勾 Execute Directly,否则跳过 Design 阶段不会生成 Spec)Run Spec 进入执行Download → Qoder 客户端会自动写入 .qoder/specs/<feature>.md(文件名基于 Spec 标题 slug 生成,零配置)git add 纳入版本库路径 B · 手动 CR 目录
mkdir -p .qoder/changes/CR-$(date +%F)-<feature-name>.qoder/changes/TEMPLATE.md(若存在)建立:
spec.md:需求背景 / 目标 / 非目标 / 范围design.md:接口设计 / 流程图 / 状态机tasks.md:任务分解(建议映射到 todo_write 的 tasklist)decisions.md:关键决策(交互默认值 / 参数命名 / 分支策略 等)test-plan.md:单测 / 集成 / 回归rollback.md:回滚预案trace.md:后续持续更新的追溯链(分支 / commits / push / PR / release)⚠️ 重要:任何写代码动作前必须确定一条干净、起点正确的 feat 分支,禁止在 master 直接改动。
同步两个远程最新状态
git fetch origin
git fetch aliyun
判断是否可复用当前 feat 分支(避免每次都新切)
先读取当前仓库状态:
git branch --show-current # 当前分支名
git status --short # 工作区是否干净
git log --oneline aliyun/master..HEAD -1 # 是否领先 aliyun/master
git log --oneline HEAD..aliyun/master -1 # 是否落后 aliyun/master
可复用的充要条件(必须全部满足):
feat- 或 feat/ 开头,且不是 master / maingit status --short 输出为空,允许未入库的变更档案除外,但需在后续一起提交)aliyun/master(即 HEAD..aliyun/master 为空;若落后,需先 rebase 或用户确认处理策略)决策分发:
"检测到当前在
feat/xxx分支,已与aliyun/master同步且工作区干净。是 直接复用当前分支 继续开发,还是 从aliyun/master新切一条 feat 分支?"
新切 feat 分支(默认路径)
基于 aliyun/master 创建(以 aliyun 主线为真源):
git checkout -b feat-<feature-name> aliyun/master
分支命名规范: feat-<短横线分隔的需求关键词>,如 feat-image-delete、feat-apikey-concurrency。
确认最终分支状态:
git log --oneline -1
git status
无论复用还是新切,后续 Phase 2-6 的所有动作都在这条 feat 分支上进行。
严格遵守 development.md 规则:
--name),不使用位置参数开发过程禁止任何自动 push 动作。
每次提交前必须本地全量验证:
go build ./...
go test ./... -count=1
两条命令全部通过后才能进入提交环节。
⚠️ 铁律:在用户明确指示之前,不得执行
git add/git commit。
用户指示提交后:
先展示变更,供用户审阅:
git status
git diff --stat
使用 Conventional Commits 规范:
git add -A
git commit -m "<type>: <description>
- 具体改动点 1
- 具体改动点 2
- 具体改动点 3"
<type> 从以下中选: feat / fix / test / docs / refactor / style / chore。
确认提交结果:
git log --oneline -3
更新变更档案:
.qoder/specs/<feature>.md 是否已加入本次 commit.qoder/changes/CR-xxx/trace.md⚠️ 铁律:在用户明确指示推送之前,不得执行任何
git push。
推送时机和目标由用户决定,只允许推送到 origin 和 aliyun,推送命令模板:
推送到 origin(内网归档):
git push origin feat-<feature-name>
推送到 aliyun(对客主线,PR 源分支):
git push aliyun feat-<feature-name>
两个远程同时推送(如用户要求):
git push origin feat-<feature-name>
git push aliyun feat-<feature-name>
禁止操作:
git push --force / git push -f 到任何远程(除非用户显式授权)master / main 主分支upstream--no-verify 跳过 hook推送完成后:
trace.md(路径 B)或 Spec 的"执行记录"章节(路径 A)当 feat 分支已推送到 aliyun 后,由用户在 GitHub 网页操作或通过 gh CLI 提 PR 到 aliyun/master,PR 模板要求:
PR 合并由用户(或指定 reviewer)审批,合并后的清理动作:
git checkout master
git fetch aliyun
git reset --hard aliyun/master
git branch -D feat-<feature-name> # 本地删除
git push origin --delete feat-<feature-name> # origin 删除
git push aliyun --delete feat-<feature-name> # aliyun 删除(可选,或由 PR 合并页勾选)
档案归档:
trace.md(路径 B)或 Quest Spec(路径 A)登记 PR 链接、合并 commit、对应的 release tagcommit 和 push 都需要用户明确指示后才执行aliyun/master 拉出,确保起点是对客主线origin 和 aliyun,不引入额外 fork.qoder/specs/(Quest Mode Download 自动落盘)或 .qoder/changes/(手动 CR)下建立档案,档案随代码一并入库需求启动前:
git remote -v 只有 origin 和 aliyungit fetch aliyun.qoder/specs/<feature>.md Quest Spec 或 .qoder/changes/CR-xxx/ 目录)提交前:
go build ./... 通过go test ./... -count=1 通过git status 无预期外的改动git add,与代码一同提交推送前:
feat- 开头,不是 mastertrace.md / Quest Spec 已更新本次推送意图| 陷阱 | 表现 | 规避 |
|---|---|---|
| 在 master 直接改 | git status 显示 HEAD 是 master 且有 diff | 开发前先 git checkout -b feat-xxx aliyun/master |
| 从 origin/master 起点 | feat 分支基点滞后于 aliyun 主线,PR 有冲突 | 明确从 aliyun/master 拉分支 |
| 盲目复用旧 feat 分支 | 复用了落后于 aliyun/master 或工作区有残留的分支,污染新需求 | Phase 1 步骤 2 按充要条件严格校验,任一不满足必须新切 |
| 未授权自动 push | 用户还没审查就已推送 | 推送动作必须等用户说"推送"/"push" |
| mock 漏改 CI 报错 | *mockClient does not implement agentbay.Client | 接口变更后立即 grep -r "type mock.*Client struct" 全量补齐 |
| 残留 upstream | git remote -v 仍有个人 fork | 执行 git remote remove upstream |
| 缺失变更档案 | 需求完成但仓库无 Spec / CR 目录,后续无法追溯 | 启动需求时按 Phase 0 强制二选一建立档案 |
| Quest 跳过 Design | 勾了 Execute Directly 导致 Spec 根本没生成 | New Task 时确认未勾 Execute Directly,点 Download 写盘到 .qoder/specs/ |
| 档案与代码脱节 | Spec 建好但没 git add,合并后档案丢失 | 提交前检查 git status 确保 Spec/CR 文件已进入暂存区 |