标签 OpenSpec 下的文章

GitHub: GitHub - fengshao1227/ccg-workflow: 多模型协作开发工具集 - 基于 Claude Code CLI,整合 Codex/Gemini 后端能力,提供智能路由、代码审查、Git 工具等 17+ 个命令
觉得好用请留下你的 Star

CCG v1.7.48:约束集 + 零决策,复杂功能不翻车1 CCG v1.7.48:约束集 + 零决策,复杂功能不翻车2


这次更新了啥

集成了 OpenSpec,一个规范驱动的开发框架。

说人话就是:把需求变成约束,让 AI 没法自由发挥

之前用 /ccg:workflow 做复杂功能,经常遇到这些问题:

  • 需求说得不清楚,AI 自己脑补,结果跟想的不一样
  • 上下文太长,一个会话塞不下
  • 做到一半忘了前面说的啥

OpenSpec 的思路是:先把需求拆成一条条约束,AI 照着约束执行就行,不用猜。


新增 5 个命令

命令干嘛的
/ccg:spec-init装 OpenSpec CLI,初始化项目
/ccg:spec-research分析需求,输出约束集
/ccg:spec-planCodex + Gemini 并行分析,生成执行计划
/ccg:spec-impl按计划一步步实现,完了自动归档
/ccg:spec-review双模型审查,随时可以用

流程图

需求 ──→ spec-research ──→ spec-plan ──→ spec-impl
              │                │              │
           约束集          零决策计划      机械执行
              │                │              │
         "JWT TTL=15min" "用 bcrypt"    照着写就行
         "锁定30min" "cost=12"      不用想

每个阶段之间可以 /clear,不怕上下文爆。


约束集长啥样

传统方式,AI 研究完给你一堆信息:

JWT 是一种 token 格式,可以用来做认证...
刷新令牌可以用来获取新的访问令牌...
密码加密可以用 bcrypt 或者 argon2...

看完还是不知道该怎么做。

OpenSpec 方式,输出的是约束:

硬约束:
- JWT TTL = 15min,刷新令牌 TTL = 7d - bcrypt cost = 12 - 5 次失败后锁定 30min

软约束:
- 刷新令牌用完即失效 - 支持多设备登录

依赖:
- 需要 redis 存黑名单

风险:
- 用户表要加 failed_attempts 字段 

后面 plan 和 impl 阶段照着这个来,不用再想。


怎么用

# 先更新
npx ccg-workflow@latest

# 初始化 OpenSpec
/ccg:spec-init

# 开始
/ccg:spec-research 实现用户认证,支持 JWT 和刷新令牌
# → 输出约束集

/ccg:spec-plan
# → Codex 和 Gemini 并行分析,输出 tasks.md

/ccg:spec-impl
# → 按 tasks.md 执行,完了自动归档 # 想审查一下
/ccg:spec-review


spec-review 审查啥

Codex 和 Gemini 同时跑,各看各的:

Codex 看Gemini 看
规范约束有没有满足命名规范、代码风格
安全SQL 注入、权限XSS、CSRF
质量逻辑对不对好不好维护

结果分三级:

  • Critical - 必须改
  • Warning - 建议改
  • Info - 随便


和原来的命令啥关系

OpenSpec 这套适合复杂功能,需要追溯的那种。

简单任务还是用原来的:

  • /ccg:workflow - 一把梭
  • /ccg:frontend / /ccg:backend - 单一领域
  • /ccg:feat - 快速开发


常见问题

Q: OpenSpec CLI 装不上?

npm install -g @fission-ai/openspec@latest

Q: 上下文快满了?

每个阶段结束会提示 token 用量,快满了就 /clear,然后继续下一个命令。状态都存在 openspec/ 目录里,不会丢。

Q: 可以跳过 research 直接 plan 吗?

可以,但约束不完整的话 plan 阶段还是要做决策,效果打折。


鸣谢


版本: v1.7.48 | 更新


📌 转载信息
原作者:
feng_li
转载时间:
2026/1/24 06:33:26

不太懂 openspec ,最近了解了一下。自己在某个仓库使用 openspec 写了一次需求,也观察了一下 openspec 自身是怎么使用的,发现 openspec 的 spec 似乎就是在用自然语言描述代码逻辑行为的各种 case 。以 openspec 仓库自身的 spec 为例,发现 spec.md 文件本身是在描述代码的行为逻辑。比如 openspec 的某个 spec.md 对应行为就是这个文件: https://github.com/Fission-AI/OpenSpec/blob/8332a098118a6584a7104ccfe8e46669a1c24b7d/src/utils/change-utils.ts#L112spec.md 本身贴在末尾

我的问题是:

  1. 这样的 spec 存下来有什么意义?因为我理解存下来是为了后续有其他需求迭代时给 ai 看的,那为什么不直接让 ai 去读代码来理解现有的逻辑呢?我理解大型项目让 ai 工作是需要知识库的,但是 openspec 的 spec 更像一个细节说明书,而不是类似纲领的知识库。是不是说在 openspec 的工作流里面 spec 才是代码仓库的行为核心准则,理论上基于 spec.md 可以随时生成一套具体实现可能不一致,但行为一致的代码。
  2. openspec 的工作流程是先让 AI 进行 plan ,然后迭代 plan ,直到 AI 给出 plan 满意了,然后 AI 开始进行 coding 。这个 plan 的流程现在 antigravity 等也能做到。感觉 plan 并不是 openspec 的重点,spec.md 才是重点是吗?如果说期望的流程是先和 ai 讨论出充满细节的 spec ,再让 ai 开始 coding ,有种变成了自然语言描述写代码的感觉,这个感觉非常怪。
  3. 基于 1 的末尾提出的“spec 才是代码仓库的行为核心准则”的想法,假设需要落地到一个前端项目,那按照这个 spec 粒度,我感觉每个 tsx 文件都需要一个 spec 去描述它的规范行为。这个感觉就更怪了

有没有实践比较多的朋友能给一些输入,分享一些经验,或者思考?

附上的 spec.md

change-creation 规范

目的( Purpose )

提供用于以编程方式创建和校验 OpenSpec change 目录的工具函数。


需求( Requirements )

需求:Change 创建( Change Creation )

系统 必须( SHALL ) 提供一个函数,用于以编程方式创建新的 change 目录。

场景:创建 change

  • 当( WHEN ) 调用 createChange(projectRoot, 'add-auth')
  • 那么( THEN ) 系统会创建 openspec/changes/add-auth/ 目录

场景:拒绝重复的 change

  • 当( WHEN ) 调用 createChange(projectRoot, 'add-auth'),且 openspec/changes/add-auth/ 已存在
  • 那么( THEN ) 系统抛出一个错误,表明该 change 已存在

场景:必要时创建父目录

  • 当( WHEN ) 调用 createChange(projectRoot, 'add-auth'),且 openspec/changes/ 不存在
  • 那么( THEN ) 系统创建完整路径,包括所有必要的父目录

场景:拒绝非法的 change 名称

  • 当( WHEN ) 使用非法名称调用 createChange(projectRoot, 'Add Auth')
  • 那么( THEN ) 系统抛出一个校验错误


需求:Change 名称校验( Change Name Validation )

系统 必须( SHALL ) 校验 change 名称符合 kebab-case 规范。

场景:合法的 kebab-case 名称被接受

  • 当( WHEN ) 校验一个类似 add-user-auth 的名称
  • 那么( THEN ) 校验返回 { valid: true }

场景:允许数字后缀

  • 当( WHEN ) 校验一个类似 add-feature-2 的名称
  • 那么( THEN ) 校验返回 { valid: true }

场景:允许单个单词

  • 当( WHEN ) 校验一个类似 refactor 的名称
  • 那么( THEN ) 校验返回 { valid: true }

场景:拒绝大写字母

  • 当( WHEN ) 校验一个类似 Add-Auth 的名称
  • 那么( THEN ) 校验返回 { valid: false, error: "..." }

场景:拒绝空格

  • 当( WHEN ) 校验一个类似 add auth 的名称
  • 那么( THEN ) 校验返回 { valid: false, error: "..." }

场景:拒绝下划线

  • 当( WHEN ) 校验一个类似 add_auth 的名称
  • 那么( THEN ) 校验返回 { valid: false, error: "..." }

场景:拒绝特殊字符

  • 当( WHEN ) 校验一个类似 add-auth! 的名称
  • 那么( THEN ) 校验返回 { valid: false, error: "..." }

场景:拒绝以连字符开头

  • 当( WHEN ) 校验一个类似 -add-auth 的名称
  • 那么( THEN ) 校验返回 { valid: false, error: "..." }

场景:拒绝以连字符结尾

  • 当( WHEN ) 校验一个类似 add-auth- 的名称
  • 那么( THEN ) 校验返回 { valid: false, error: "..." }

场景:拒绝连续连字符

  • 当( WHEN ) 校验一个类似 add--auth 的名称
  • 那么( THEN ) 校验返回 { valid: false, error: "..." }

看到了佬的播放器项目:https://linux.do/t/topic/1473938
以及大佬的 API(再次感谢):https://linux.do/t/topic/1212285
秉承周末自己闲着也不能让 AI 牛马闲着,正好想试试 OpenSpec 效果如何于是有了下面的:
mplayer-eight.vercel.app
等实际试用段时间看看能不能替代 AppleMusic
[那样我就可以把订阅退了,每月立省一杯奶茶 ]

使用手机浏览器打开播放,只支持随机当背景音乐。
多久会被杀后台还没测出来。。。
用时约 2h

项目地址:GitHub - yxegla/mplayer: 简洁优雅的在线音乐播放器 - iPhone 优化


📌 转载信息
原作者:
nobody
转载时间:
2026/1/18 15:50:06