WWW.YOUINFO.SITE
标签聚合 OpenSpec

/tag/OpenSpec

LinuxDo 最新话题 · 2026-06-01 10:11:12+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI 生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI 生成、润色内容已使用截图方式发出 近期买了个 bandwagonhost 的 6c 8g vps,正在想办法迭代一个私有化部署的云端 Agent 平台,帮我 7x24 跑一些研发任务。前几天的 Opus 4.8 在推广 workflow 能力,但我目前正在高强度使用的 Openspec SDD 研发流还是串行执行的,这实在过于不现代 参考了一下 Openspec 的 Custom Schemas 模式,快速蹿了一个安装和卸载脚本,这下就能在整个 Openspec SDD 研发流愉快的调用 Workflow 做并行研发了,明天顺便也在公司内项目推广使用一下 github.com GitHub - Xeonice/opsx-turbo: Multi-agent parallel & verified OpenSpec workflow... Multi-agent parallel & verified OpenSpec workflow — turbocharge spec-driven apply with Claude Code Workflows, no skill forks. 使用方式 在已经引入 Openspec 的项目直接执行安装脚本 按你以前的方式继续调 /opsx:explore、/opsx:propose、/opsx:apply 即可 欢迎各位佬前来使用 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-23 20:51:52+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 佬友们,我最近基于OpenSpec和Superpowers做了一个开源Skills 开源链接如下 Comet: OpenSpec + Superpowers 双星开发工作流 — 从创意到归档,一条命令 另外还有B站视频介绍~ 开源!Comet: 基于OpenSpec和Superpowers怎么做出更好用的自动Spec Skills 核心主要是解决OpenSpec执行能力不够强,Superpowers对Spec全生命周期管理能力不够强的问题,只组合这两个Skill做串联流程 在这个项目可以学到: 嵌套Skill如何稳定触发,比如项目里面依赖的OpenSpec和Superpowers,本质不会对他们进行修改 轻量化状态机机制、长程任务断点恢复(省token版) 如何让组合Skill多阶段自动触发,而不是靠人工介入(因为现阶段想要组合两个Spec功能,还得靠自己手动敲斜杠命令,怪麻烦的) 等等内容 希望佬们多多点赞star,欢迎参与一起贡献~,学AI,上L站! 2 个帖子 - 1 位参与者 阅读完整话题

V2EX - 技术 · 2026-05-20 10:21:45+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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

V2EX - 技术 · 2026-05-20 10:21:45+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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

V2EX - 技术 · 2026-05-20 10:20:45+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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

V2EX - 技术 · 2026-05-18 17:45:28+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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

V2EX - 技术 · 2026-05-18 15:45:28+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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

V2EX - 技术 · 2026-05-18 14:30:08+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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

V2EX - 技术 · 2026-05-18 14:25:05+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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

V2EX - 技术 · 2026-05-18 13:03:32+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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

V2EX - 技术 · 2026-05-18 10:21:03+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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

V2EX - 技术 · 2026-05-18 09:38:46+08:00 · tech

最近想把 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.md 、 design.md 、 specs/<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