Install
openclaw skills install spec-driven-dev在克隆的 Git 仓库中驱动完整的规格驱动开发生命周期(init→requirements→architecture→process_design→project_plan→coding→test→bugfix→code_review→release)。阶段门控、产物强制输出、多语言支持,内置 commit message 检查、代码门控与 LOGAF Checklist 评审,支持任意阶段 checkpoint 保存与 rollback 恢复,并实时发出结构化进度检查点。
openclaw skills install spec-driven-dev适用于 Claude Code / OpenCode Runner 的阶段门控规格驱动开发工作流 Skill。
在 init 阶段克隆远程 Git 仓库,随后在该仓库内驱动每个生命周期阶段——强制产出产物、在迭代边界提交、并在 release 阶段推送至远端。内置 code_review 阶段,执行 commit message 合规校验、代码质量门控与 LOGAF Checklist 评审,所有 HIGH 级问题清零后方可进入 release。支持通过 spec-driven-checkpoint Skill 在任意阶段保存 checkpoint,并使用 rollback {ckpt_id} 恢复 Git 状态和 Agent 上下文。支持多语言项目,遵循 OpenSkills 渐进加载原则。
| 工具 | 用途 |
|---|---|
git | 克隆、分支、提交、打标签、推送 |
| 变量 | 是否必须 | 说明 |
|---|---|---|
SPEC_DEV_GIT_TOKEN | 必须 | HTTPS 认证用的个人访问令牌(PAT)或 OAuth2 Token。用于构造带认证的克隆 URL 并写入本地凭据助手。兼容 GitHub、GitLab、Bitbucket、Gitea 的 HTTPS 远端。 |
SPEC_DEV_GIT_USERNAME | 否 | 写入 user.name 和凭据 URL 的 Git 用户名。未设置时默认为 oauth2(兼容 GitHub/GitLab Token 认证)。 |
SPEC_DEV_GIT_EMAIL | 否 | 提交时使用的作者邮箱。未设置时默认为 bot@spec-driven-dev。 |
安全说明 —
SPEC_DEV_GIT_TOKEN仅通过 OpenClawskills.entries.*.env机制在运行时注入,绝不写入任何产物文件、日志或迭代摘要。凭据助手使用局限于当前 Agent 会话的本地~/.git-credentials存储。
# 1 – 克隆远程仓库并初始化 US 目录
init-US042
git_remote: https://github.com/my-org/my-repo.git
us_content: |
## US042 – OAuth2 登录
作为用户,我希望使用 Google 账号登录。
### 验收标准
- [ ] Google OAuth2 重定向正常
- [ ] 回调后签发 JWT
context: "Python 3.11 + FastAPI。数据库为 PostgreSQL 15,不新增依赖。"
# 2 – 链式执行各阶段(git_remote 在 init 后自动持久化到 current_iter.md)
requirements-US042
architecture-US042
process_design-US042
project_plan-US042
coding-US042
test-US042
bugfix-US042 # 仅当 test 阶段报告 HIGH 级失败时执行
code_review-US042 # 三层门控:commit message + 代码质量 + LOGAF Checklist
release-US042 # 仅当 code_review 裁决为 APPROVED 或 APPROVED_WITH_NOTES 时解锁
| 变量 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
us_id | string | 必须 | 用户故事 ID(如 US042)。从 <stage>-<us_id> 触发模式中自动捕获,映射至所有产物路径。 |
stage | enum | 必须 | 生命周期阶段:init · requirements · architecture · process_design · project_plan · coding · test · bugfix · code_review · release |
git_remote | string | init 阶段必须 | 远程 Git 仓库的 HTTPS URL。init 后存入 current_iter.md,后续阶段自动读取,无需重复传入。 |
us_content | string | 否 | 用户故事完整文本。在阶段运行前写入 requirements/US/{us_id}.md。已存在时追加合并,除非 force_overwrite: true。 |
context | string | 否 | 自由格式的补充上下文,逐字注入到本次产出的每个产物的 ### 补充上下文 标题下。适用于 ADR 摘录、环境约束、Review 反馈等。 |
iter_id | string | 否 | 当前迭代 ID(如 iter_003)。省略时自动从 current_iter.md 中检测;首次运行默认为 iter_001。 |
force_overwrite | bool | 否 · 默认 false | 为 true 时覆盖已有产物文件,而非追加合并。 |
skip_skill_scan | bool | 否 · 默认 false | 为 true 时跳过 available_skills.xml 扫描(适用于 Runner 已在外部完成 Skill 解析的场景)。 |
本 Skill 在以下情况激活:
阶段命令模式 — 用户输入 <stage>-<us_id>,例如:
init-US042coding-US042code_review-US042release-FEAT_LOGINCheckpoint 命令 — 任意时刻均可触发:
save_checkpoint-{us_id} 或 checkpoint-{us_id} — 手动保存当前状态rollback {ckpt_id} — 回滚到指定 checkpointrollback {ckpt_id} --git-only — 仅回滚 Gitrollback {ckpt_id} --context-only — 仅输出恢复 Promptlist_checkpoints-{us_id} — 列出所有 checkpoint下一迭代意图 — 用户输入以下任意一种:
{us_id}进行下一个迭代next iteration {us_id}start|begin|run|execute … sprint|iteration|milestone→ 自动从 requirements/{us_id}/docs/iteration_summary/current_iter.md 恢复上下文继续执行
所有路径使用 {us_id}、{iter_id}、{version} 作为占位符。
requirements/US/{us_id}.md
requirements/{us_id}/docs/requirements.md
requirements/{us_id}/docs/architecture.md
requirements/{us_id}/docs/process_design.md
requirements/{us_id}/docs/project_plan.md
requirements/{us_id}/docs/tasks.json
requirements/{us_id}/docs/iteration_summary/current_iter.md
requirements/{us_id}/docs/iteration_summary/{iter_id}.md
requirements/{us_id}/docs/release_notes/{version}.md
requirements/{us_id}/docs/reports/test-{us_id}-report.md
requirements/{us_id}/docs/reports/review-{us_id}-{iter_id}.md
requirements/{us_id}/docs/checkpoints/index.md
requirements/{us_id}/docs/checkpoints/{ckpt_id}.md
auxiliary/coding_standards.md
auxiliary/gitflow_guide.md
auxiliary/skills/available_skills.xml
src/
tests/
config/
CHANGELOG.md
PROJECT_STATUS.md
.github/workflows/ci.yml
每次调用必须按顺序执行以下六步协议。
stage_start 检查点[SKILL:spec-driven-dev] CHECKPOINT stage_start STATUS=OK us_id={us_id} stage={stage}
us_id 和 stage 已存在。us_content,写入(或合并)到 requirements/US/{us_id}.md。context,在内存中保存,并在本次产出的每个产物中以 ### 补充上下文 标题开头注入。iter_id:
current_iter.md 中读取。iter_001。git_remote:
current_iter.md 的 git_remote: 字段中读取。init,发出警告后继续执行。[SKILL:spec-driven-dev] CHECKPOINT inputs_validated STATUS=OK
skip_skill_scan: true 时跳过)auxiliary/skills/available_skills.xml。"我将调用 Skill:
<n>来辅助本次任务。" 随即完整加载auxiliary/skills/<n>/SKILL.md后再继续执行。
[SKILL:spec-driven-dev] CHECKPOINT skill_scan_done STATUS=OK skills_loaded=[…]
严格按照下方阶段定义章节执行。 每写完一个强制输出文件后发出:
[SKILL:spec-driven-dev] CHECKPOINT artefacts_written STATUS=OK files=[…]
按语言检测表运行静态检查和测试。
通过时:
[SKILL:spec-driven-dev] CHECKPOINT quality_gate_passed STATUS=OK
失败时:发出 STATUS=FAIL,汇总失败信息,并指示 Agent 进入 bugfix 阶段。
同一问题连续失败 5 次后,停止自动修复并请求人工介入。
iter_id(如 iter_003 → iter_004)。requirements/{us_id}/docs/iteration_summary/{iter_id}.md。requirements/{us_id}/docs/iteration_summary/current_iter.md。PROJECT_STATUS.md。[SKILL:spec-driven-dev] CHECKPOINT iteration_summary_written STATUS=OK iter_id={iter_id}
stage_done[SKILL:spec-driven-dev] CHECKPOINT stage_done STATUS=OK
<stage_done>
init目的: 从环境变量配置 Git 凭据、将远程仓库克隆到工作区、初始化 US 目录树,并将纯文本 git_remote URL 记录到迭代摘要,供后续所有阶段免密推拉使用。
读取: 无(从零启动)
写入:
requirements/US/{us_id}.md(脚手架或来自 us_content)requirements/{us_id}/docs/ 目录树requirements/{us_id}/docs/iteration_summary/current_iter.md(存根)PROJECT_STATUS.md(初始条目)凭据配置 — 按此顺序执行:
# 1. 从环境变量解析运行时值
GIT_USER="${SPEC_DEV_GIT_USERNAME:-oauth2}"
GIT_EMAIL="${SPEC_DEV_GIT_EMAIL:-bot@spec-driven-dev}"
GIT_TOKEN="${SPEC_DEV_GIT_TOKEN}" # 必填;metadata.requires.env 已做门控
# 2. 构造带认证的克隆 URL(Token 内嵌,绝不写入产物)
# 兼容:https://github.com/… https://gitlab.com/… https://bitbucket.org/…
REMOTE_HOST=$(echo "${git_remote}" | sed 's|https://||' | cut -d'/' -f1)
CLONE_URL="https://${GIT_USER}:${GIT_TOKEN}@${REMOTE_HOST}/$(echo "${git_remote}" | sed "s|https://${REMOTE_HOST}/||")"
# 3. 克隆
git clone "${CLONE_URL}" .
# 4. 设置提交身份
git config user.name "${GIT_USER}"
git config user.email "${GIT_EMAIL}"
# 5. 持久化凭据,供本工作区后续 push/pull 静默认证
git config credential.helper store
printf "https://%s:%s@%s\n" "${GIT_USER}" "${GIT_TOKEN}" "${REMOTE_HOST}" \
>> ~/.git-credentials
chmod 600 ~/.git-credentials
Token 绝不写入任何产物或日志。 仅将不含凭据的裸
git_remoteURL 存入current_iter.md。
关键指令:
us_content,写入 requirements/US/{us_id}.md;否则写入含占位标题的 Markdown 脚手架。context,在脚手架中注入 ### 补充上下文 节。current_iter.md 的 git_remote: 字段中记录纯文本 git_remote URL(不含 Token)。requirements读取:
requirements/US/{us_id}.mdauxiliary/coding_standards.md写入:
requirements/{us_id}/docs/requirements.md关键指令:
context 至 ### 补充上下文。architecture读取:
requirements/{us_id}/docs/requirements.mdauxiliary/coding_standards.mdauxiliary/gitflow_guide.md写入:
requirements/{us_id}/docs/architecture.md — 必须包含 Mermaid 架构图关键指令:
mermaid 架构图。context 至 ### 补充上下文。process_design读取:
requirements/{us_id}/docs/architecture.md写入:
requirements/{us_id}/docs/process_design.md — 必须包含 Mermaid 流程图或状态图关键指令:
mermaid 流程图或序列图。project_plan读取:
requirements/{us_id}/docs/architecture.mdrequirements/{us_id}/docs/process_design.md写入:
requirements/{us_id}/docs/project_plan.mdrequirements/{us_id}/docs/tasks.json关键指令:
tasks.json:
[
{
"id": "task-1",
"name": "任务名称",
"scope": "src/module/",
"stage": "coding",
"depends_on": []
}
]
coding读取:
requirements/{us_id}/docs/iteration_summary/current_iter.md ← 优先读取requirements/{us_id}/docs/architecture.mdrequirements/{us_id}/docs/process_design.mdrequirements/{us_id}/docs/tasks.jsonauxiliary/coding_standards.mdauxiliary/gitflow_guide.md写入:
src/ 下的源代码文件tests/ 下的测试文件关键指令:
current_iter.md 了解历史进度。feature/{task-name} 分支(GitFlow)。test / bugfix 阶段完成)。context 注入相关模块级 docstring。test读取:
src/ 下的源代码文件auxiliary/coding_standards.md写入:
requirements/{us_id}/docs/reports/test-{us_id}-report.md关键指令:
bugfix读取:
requirements/{us_id}/docs/reports/test-{us_id}-report.md写入:
src/ 下更新后的源代码文件tests/ 下更新后的测试文件requirements/{us_id}/docs/reports/test-{us_id}-report.md(追加新条目)关键指令:
spec-driven-checkpoint:
invoke_skill: spec-driven-checkpoint
action: save
with:
us_id: "{us_id}"
iter_id: "{iter_id}"
stage: "bugfix"
interrupt_reason: "bugfix_loop_{n}"
pending_items: "修复失败的问题列表"
code_review目的(Orchestrator): 按序调用三个独立子 Agent,依次执行门控一→二→三;收集每个子 Agent 的结构化输出,合并写入最终评审报告,并根据聚合裁决决定是否解除 release 进入锁。
三个子 Agent Skill 须已安装到
auxiliary/skills/并注册在available_skills.xml中:
cr-commit-check— 门控一:Commit Message 合规校验cr-code-gate— 门控二:代码质量静态门控cr-logaf-review— 门控三:LOGAF Checklist 全面评审
读取:
requirements/{us_id}/docs/iteration_summary/current_iter.mdrequirements/{us_id}/docs/reports/test-{us_id}-report.mdauxiliary/skills/available_skills.xml(确认三个子 Agent 已注册)写入:
requirements/{us_id}/docs/reports/review-{us_id}-{iter_id}.md(汇总评审报告)[SKILL:spec-driven-dev] CHECKPOINT review_start STATUS=OK us_id={us_id} iter_id={iter_id}
在调用任何子 Agent 之前,统一收集以下数据并缓存,按需传入各子 Agent:
# 1. 获取 commit log(门控一使用)
GIT_LOG=$(git log main..HEAD --pretty=full)
# 2. 获取完整 diff(门控二、三使用)
GIT_DIFF=$(git diff main...HEAD)
# 3. 路径常量
TASKS_PATH="requirements/{us_id}/docs/tasks.json"
ITER_PATH="requirements/{us_id}/docs/iteration_summary/current_iter.md"
TEST_REPORT_PATH="requirements/{us_id}/docs/reports/test-{us_id}-report.md"
cr-commit-check(门控一)invoke_skill: cr-commit-check
with:
us_id: "{us_id}"
iter_id: "{iter_id}"
git_log: $GIT_LOG
tasks_json_path: $TASKS_PATH
[SKILL:spec-driven-dev] CHECKPOINT review_commit_msg STATUS=<OK|FAIL>
分支逻辑:
verdict == "FAIL" → 立即终止,跳转至「汇总报告」步骤,release 被阻塞。verdict == "PASS" → 继续阶段 R-2。cr-code-gate(门控二)invoke_skill: cr-code-gate
with:
us_id: "{us_id}"
iter_id: "{iter_id}"
git_diff: $GIT_DIFF
iter_summary_path: $ITER_PATH
coding_standards_path: "auxiliary/coding_standards.md"
缓存返回的 findings 供门控三去重使用:
[SKILL:spec-driven-dev] CHECKPOINT review_code_gate STATUS=<OK|WARN|FAIL>
分支逻辑:
verdict == "FAIL" → 立即终止,跳转至「汇总报告」步骤,release 被阻塞。verdict == "PASS" 或 "WARN" → 继续阶段 R-3,携带 findings。cr-logaf-review(门控三)invoke_skill: cr-logaf-review
with:
us_id: "{us_id}"
iter_id: "{iter_id}"
git_diff: $GIT_DIFF
us_file_path: "requirements/US/{us_id}.md"
architecture_path: "requirements/{us_id}/docs/architecture.md"
test_report_path: $TEST_REPORT_PATH
code_gate_findings: <门控二返回的 findings 数组>
[SKILL:spec-driven-dev] CHECKPOINT review_checklist STATUS=<APPROVED|APPROVED_WITH_NOTES|REQUEST_CHANGES>
| 最终裁决 | 触发条件 |
|---|---|
| REQUEST_CHANGES | 门控一 FAIL,或 门控二 FAIL,或 门控三 REQUEST_CHANGES |
| APPROVED_WITH_NOTES | 无 FAIL / REQUEST_CHANGES,但门控二 WARN 或门控三 APPROVED_WITH_NOTES |
| APPROVED | 三层全部 PASS / APPROVED,且无任何 h 级发现 |
[SKILL:spec-driven-dev] CHECKPOINT review_done STATUS=<APPROVED|APPROVED_WITH_NOTES|REQUEST_CHANGES>
写入 requirements/{us_id}/docs/reports/review-{us_id}-{iter_id}.md:
# Code Review 报告 – {us_id} / {iter_id}
**日期:** YYYY-MM-DD
**Orchestrator:** spec-driven-dev
**最终裁决:** APPROVED | APPROVED_WITH_NOTES | REQUEST_CHANGES
---
## 门控一:Commit Message 校验(cr-commit-check)
| 规则 ID | 结果 | 备注 |
|---------|--------|------|
| CM-01 | ✅/❌ | |
| CM-02 | ✅/❌ | |
| CM-03 | ✅/❌ | |
| CM-04 | ✅/❌ | |
| CM-05 | ✅/❌ | |
| CM-06 | ✅/❌ | |
**门控结论:** PASS / FAIL
---
## 门控二:代码质量门控(cr-code-gate)
| 发现 ID | LOGAF | 结果 | 文件:行 | 描述 | 建议 |
|---------|-------|-------|---------|------|------|
| GK-xx | `h` | ✅/❌ | | | |
**门控结论:** PASS / WARN / FAIL
**h 级:** N | **m 级:** N | **l 级:** N
---
## 门控三:LOGAF Checklist(cr-logaf-review)
| 发现 ID | LOGAF | 结果 | 文件:行 | 描述 | 建议 |
|---------|-------|-------|---------|------|------|
| CR-xx | `m` | ⚠️ | | | |
**评审结论:** APPROVED / APPROVED_WITH_NOTES / REQUEST_CHANGES
**h 级:** N | **m 级:** N | **l 级:** N
---
## 总结与下一步行动
<!-- REQUEST_CHANGES:列出全部 h 级问题,说明须重走 bugfix→test→code_review -->
<!-- APPROVED_WITH_NOTES:列出 m/l 级建议,可在后续迭代跟进 -->
<!-- APPROVED:解除 release 进入锁 -->
code_review 阶段裁决规则| 最终裁决 | 条件 | 对 release 的影响 |
|---|---|---|
| APPROVED | 三层门控全部 PASS,无任何 h 级问题 | ✅ 解除 release 进入锁 |
| APPROVED_WITH_NOTES | 无 h 级问题,存在 m/l 级问题已记录 | ✅ 解除 release 进入锁,已知风险已存档 |
| REQUEST_CHANGES | 存在任意 h 级问题(门控二或门控三) | ❌ 阻塞 release,必须重走 bugfix→test→code_review。同时自动触发 checkpoint 保存:invoke_skill: spec-driven-checkpoint action: save … interrupt_reason: "review_rejected" |
release目的: 提交本迭代所有变更、升级版本号、更新变更日志、写入发版说明,并将提交与标签推送至远端。
读取:
requirements/{us_id}/docs/reports/review-{us_id}-{iter_id}.md ← 必须为 APPROVED 或 APPROVED_WITH_NOTES,否则直接拒绝进入CHANGELOG.mdrequirements/{us_id}/docs/iteration_summary/current_iter.md(获取 git_remote)写入:
main(或配置的基础分支)上的单次迭代提交pyproject.toml / package.json / Cargo.toml 等)CHANGELOG.md(增量更新)requirements/{us_id}/docs/release_notes/{version}.mdv{version}关键指令:
前置门控检查:读取 review-{us_id}-{iter_id}.md,确认最终裁决为 APPROVED 或 APPROVED_WITH_NOTES。若为 REQUEST_CHANGES 则立即终止,输出:
[SKILL:spec-driven-dev] RELEASE BLOCKED — code_review 裁决为 REQUEST_CHANGES,
请先完成 bugfix → test → code_review 循环,清零所有 h 级问题。
确认凭据助手仍处于活动状态;如会话已刷新,重新执行 init 凭据配置代码块:
git config credential.helper # 应返回 "store"
根据本迭代最高级别的提交类型确定版本升级幅度:
feat → minorfix · chore · docs · test · refactor · perf · style · config · build → patchfeat! 或 BREAKING CHANGE → major暂存所有变更并创建单次迭代提交:
{type}(#{us_id}/{iter_id}): {task_id1}/{desc1}, {task_id2}/{desc2}, …
允许的 type:feat|fix|config|docs|test|refactor|perf|style|chore|build
按语言运行版本升级命令:
cz bumpnpm version <major|minor|patch>cargo release <level>git tag v{version}在 CHANGELOG.md 中追加新版本块。
将用户友好的发版说明写入 requirements/{us_id}/docs/release_notes/v{version}.md。
推送提交和标签(凭据助手静默处理认证):
git push origin main
git push origin "v{version}"
| 根目录文件 | 语言 | 格式化工具 | Lint 工具 | 类型检查 | 测试框架 |
|---|---|---|---|---|---|
pyproject.toml | Python | black | ruff | mypy | pytest |
package.json + tsconfig.json | TypeScript | Prettier | ESLint | tsc | Jest / Vitest |
go.mod | Go | gofmt | golangci-lint | — | go test |
Cargo.toml | Rust | rustfmt | clippy | — | cargo test |
pom.xml | Java | spotless | Checkstyle | SpotBugs | JUnit 5 |
用于每个 {iter_id}.md 和 current_iter.md,目标控制在 800–1500 Token。
# 迭代摘要 – {iter_id}
**日期:** YYYY-MM-DD
**US:** {us_id}
**已完成阶段:** {stage}
**git_remote:** https://github.com/org/repo.git
**Code Review 裁决:** APPROVED | APPROVED_WITH_NOTES | REQUEST_CHANGES | 本阶段未执行
**调用的 Skill:** <逗号分隔列表,或填"无">
## 本次迭代目标
<一段话说明本次迭代要达成什么。>
## 架构 / 流程变更
<本次迭代做出或修订的结构性决策。无变化则填"无"。>
## 已完成任务
| 任务 ID | 描述 | 状态 |
|---------|------|------|
| task-1 | … | ✅ 完成 |
## 关键优化点
- …
## 本次发布版本
<vX.Y.Z 或"本次迭代未发布">
## 待办 / 下一步
- …
## 项目状态快照
<2–3 句话:测试覆盖率、未解决阻塞项、下一个里程碑。>
注意:
git_remote只存储纯文本 URL — 不含 Token 或任何凭据。
每次响应必须采用以下结构:
列出本次将完成的步骤。
粘贴 auxiliary/skills/available_skills.xml 的完整内容。
宣布并加载匹配 Skill 的 SKILL.md。
每个新建或修改的文件:完整路径 + 完整内容(或统一 diff),置于代码块中。
格式化工具、Lint、类型检查、测试框架的关键输出。
精确的提交信息、版本升级命令、打标签命令和推送命令。
填写完整的迭代摘要模板。
本次运行的每个检查点及其状态。
SPEC_DEV_GIT_TOKEN 或任何凭据写入任何文件、日志或产物。code_review 阶段直接进入 release。code_review 裁决为 REQUEST_CHANGES 时执行 release;必须先清零所有 h 级问题。m/l 级问题升级为阻塞项,除非用户明确要求。current_iter.md 和输入变量中获取。test 阶段存在未解决的 HIGH 级失败时进入 code_review 阶段。