我把 OpenSpec 揉进开发流程里了,让 Claude Code 自己学着用 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
fennu2333

我把 OpenSpec 揉进开发流程里了,让 Claude Code 自己学着用

  •  
  •   fennu2333 16h 47m ago 1650 views

    最近想把 OpenSpec 集成进自己的 coding agent 工作流项目,让 Claude Code 自己用,省得我还得手动调 skill 或者敲命令行(其实就是工具太多了学不过来,丢在工作流里让他自己 drive 哈哈,正好社区里也有呼声把 OpenSpec 支持加进去)。做完感觉挺好使的,给大伙唠唠

    之前我自己做了几个月一个开源项目叫 Chorus,本质上是一个带前端的 agent harness ,负责驱使 Claude Code 跑完整条开发流程:你扔一个粗糙的想法进去,它先和你聊清楚想做什么,接着写计划、拆任务、自己干活、自己 review ,最后把验收完的成果交回来。整个过程它在 drive ,人只在关键节点拍板。

    为什么想接 OpenSpec

    OpenSpec 是社区一个 spec-driven 开发 CLI ,思路很清爽。所有 spec 都以文件形式躺在仓库里,用一个固定的目录约定组织。每次 change 是 openspec/changes/<slug>/,里面 proposal.mddesign.mdspecs/<capability>/spec.md 各自一份 markdown 。spec 不写完整状态,写 delta ,用 ## ADDED Requirements 这种块表达"这次改了什么"。change 落地后跑一次 openspec archive <slug>,CLI 自己把 delta 合进长期 spec 。

    挺好的工具,但用起来有个挺现实的问题,每一步都得人去推。开新 change 要记得 openspec new change,写完要记得 openspec validate,change 完成后要记得 openspec archive。忘做一步就整段垮掉,下一次 change 写出来跟前一次接不上。

    而 Chorus 本来就在驱动整条开发流程,它知道现在是在和用户聊想法、还是在写计划、还是任务全部干完准备收尾。这些信号天然就是 OpenSpec 命令该不该触发的依据。让 Chorus 一边驱动流程,一边在合适的节点提醒 agent 跑 OpenSpec 命令,用户就不用学一套新的工具。从他的视角看,他还是在跟 Chorus 用同样的方式聊天写代码,只是中间生成的文档变成了仓库里规范的 spec 文件。

    我想达到的最终效果是 Chorus 在 drive 流程,OpenSpec 在管文档,Claude Code 把两边串起来自己跑。

    如何不占用 LLM token 的同时完成文档同步?

    具体怎么串?真正的设计难点在这一步:Chorus 是个外部服务,文档存在它的数据库里然后在前端展示,可 OpenSpec 写出来的 spec 文件躺在本地仓库里。怎么把本地文件同步到 Chorus 那边?

    最朴素的做法是让 LLM 调 MCP tool 把 markdown 灌到参数里。试了一下发现一份完整的 spec 同步一次 content tokens 可能会用一二十 K ,整个 markdown 要先从 LLM 输出一次再被它重新打字进参数,又费钱又不靠谱,没办法保证 LLM 1:1 完整输出整个文档。

    那走 CLI 就好了,写一个同步命令,LLM 只调命令、不碰文件内容。但我又不想让用户额外装一个 cli 。

    翻了下 Claude Code 文档,发现插件 bin/ 目录下所有 shell 脚本都会被自动加进 session 的 PATH。Chorus 本来就有个 Claude Code 插件,那直接把同步脚本放插件 bin/ 里就行了。用户装好 Chorus 插件,脚本就跟着到位,agent 在任何路径下都能直接 chorus-api.sh mcp-tool <tool> "$PAYLOAD" 调到,不用关心装哪了。再写一个 skill 文件教 CC 什么时候该调它,集成就成立了。

    插件结构大概长这样:

    chorus-plugin/ ├── bin/ │ └── chorus-api.sh # 自动加进 $PATH ,agent 直接按名字调 ├── hooks/ │ └── hooks.json # 注册各种生命周期 hook └── skills/ └── openspec-aware/ └── SKILL.md # 教 CC 什么时候用 chorus-api.sh 同步文档 

    chorus-api.sh 完整代码在 仓库里,核心就是 jq -Rs '.' 把文件流成 JSON 字符串后塞进 MCP payload ,从头到尾 LLM 看不到文件正文。

    什么时候触发 OpenSpec 的操作?

    OpenSpec 的流程从开新 change 到最后 archive ,每一步都得在合适的时机被触发。让 agent 自己记得这些时机不靠谱,但 Chorus 本来就在 drive 流程,时机的信号都有,关键是把信号转成对 agent 的提醒。

    session 启动是第一个时机。Chorus 插件的 SessionStart hook 顺手检测一下仓库里有没有 openspec/ 目录、openspec CLI 在不在 PATH 上,两个都满足就给 session 注入一个标记,skill 文件读到标记就走 OpenSpec 路径,否则维持原来的自由 markdown 路径,老项目完全不受影响。

    任务全部验收完是另一个时机,也是我自己最喜欢的一个。OpenSpec 要求每个 change 完成后跑一次 openspec archive <slug>,把这次的 delta 合进长期 spec ,忘了的话下次写 change 就跟这次接不上。让 agent 自己记得实在不现实,"完成"是好几个 turn 之后才发生的事,agent 早就在想下一件事了。但 Chorus 知道什么时候算完成,所有任务都被验收的那一刻嘛。所以挂了个 PostToolUse hook ,每次有任务被验收,hook 顺手查一下这一波相关的任务是不是都 done 了。是的话,就往 agent 的最终回复里注入一条提醒,让它去跑 openspec archive <slug> -y 并把生成的长期 spec 同步回 Chorus 。

    整个流程对用户是隐形的。你只是和 Claude Code 一起完成了一个 feature 的开发,agent 自己就把 OpenSpec 那边该开的开了、该归档的归档了。

    工具越来越多,人也越来越累

    我记得 React 18 和 Vue 3.0 刚出的时候社区一片哀嚎:求求别再出新东西了,学不动了。当时肯定想不到 2026 年工具每周甚至每天都在出,虽然代码是 CC 写的,但为了用好 CC 还是得学一大堆东西。我自己也被铺天盖地的工具烦得不行,像 OpenSpec 这种确实好用,但架不住要学啊。

    这次试着把这些工具放进一套流程里,让 CC 自己判断什么时候用、怎么用,自己用下来其实挺舒服的。那是不是之后团队配一套共享的开发流程,直接分发给每个成员就行了?

    代码都在 Chorus 仓库,OpenSpec 项目在这: https://github.com/Fission-AI/OpenSpec

    10 replies    2026-05-18 21:47:31 +08:00
    mfkickdx78
        1
    mfkickdx78  
       16h 8m ago
    牛逼啊佬
    TangCuYu2333
        2
    TangCuYu2333  
       13h 25m ago via Android
    一直都在用,感觉很不错
    tmtstudio
        3
    tmtstudio  
       12h 4m ago
    大佬我怎么没办法分配给智能体
    https://ibb.co/N2VChJVK
    craftsmanship
        4
    craftsmanship  
       11h 59m ago via Android
    只要学得够慢就不用学。。。前提是能稳定混日子 不会突然失业 不需要准备面试
    fennu2333
        5
    fennu2333  
    OP
       11h 58m ago
    @tmtstudio Hi, 这是一个权限重构留下的问题,我今天就修了他你可以让 cc 自己去认领这个任务,不需要手动分配
    fennu2333
        6
    fennu2333  
    OP
       10h 48m ago
    @tmtstudio 已经发布 @chorus-aidlc/[email protected] 修复了这个问题,感谢反馈
    tmtstudio
        7
    tmtstudio  
       10h 43m ago
    @fennu2333 大佬太快了!我去试试
    spediacn
        8
    spediacn  
       5h 3m ago via iPhone
    楼主还可以看看:
    MetaGPT
    Issue-Ops

    OpenSpec 我用了一下发现太耗令牌了,sdd 大规模的文档对齐就是一组巨量令牌消耗。最后发现写代码耗费的令牌只有文档对齐耗费的令牌的零头。细思考,其实都还没脱离人类编程模式的路子。

    现在我倾向 SOP+敏捷,文档直接进 RAG ,用 MCP 来调用。当然,也许再过几个月就换思路了。现在各种模式我都会试试,在为自己整理思路 ing 。
    spediacn
        9
    spediacn  
       5h 0m ago via iPhone
    但我相信未来开发语言会大洗牌,很多复杂的设计模式会被扔进垃圾堆,用大模型容易理解的语言才是最好的
    fennu2333
        10
    fennu2333  
    OP
       4h 41m ago
    @spediacn SDD 不管用哪个形式,烧 Token 都是不可避免的,不过我觉得写文档用的 Token 比写代码多也没啥,文档也是资产之一,而且整个开发流程左移也是趋势。还是看团队,SDD 现在还是比较适合个人开发或者很小的团队,人一多就得考虑文档平台,SOP 啥的了
    About     Help     Advertise     Blog     API     FAQ     Solana     1097 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 18:29 PVG 02:29 LAX 11:29 JFK 14:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86