跳转到主要内容
0.3.9 的 Comet 是一个优秀的”五阶段工作流层”——它把 OpenSpec 和 Superpowers 串成一条可恢复的开发流水线,靠 Bash 脚本守护阶段边界。但用着用着,两类限制越来越明显: 一类是已有能力的硬伤——
  • Windows 用户必须装 Git Bash 或 WSL 才能跑完整流程;
  • /comet 的路由全靠 Agent 重新读提示词”猜”一次,错了无从复查;
  • 中断后回来,所有状态挤在一个 .comet.yaml 里,机器字段和人类字段互相污染。
另一类是根本不存在的空白——
  • 用户只能消费 Comet 预置的 /comet 系列命令,没办法自己造 Skill,更别说把任意 Skill 组合成一个和 /comet 一样好用的可复用包;
  • 没有任何手段量化”这个 Skill 到底好不好”,改进全凭感觉;
  • 一个变更跑到一半,想看它产出了什么、卡在哪,只能去翻文件。
0.4.0-beta.1 针对第一类做了一次系统重构,针对第二类一次性补上了三个全新系统。这篇文章不讲功能清单(见 changelog),而是讲每个决策背后的原因

小鱼在改造工作台上把 0.3.9 的 Bash 脚本换成 0.4.0 的 Node runtime,并挂上意图路由、状态分层、Skill 平台、eval 和 Dashboard 模块

0.4.0 把 Comet 从 Bash 工作流层改造成跨平台运行时,并长出 Skill 创作、评估、可视化三个新系统

一、为什么把 Bash 运行时换成 Node

这是 0.4.0 最大的重构,也是最受 Windows 用户欢迎的改动。 0.3.9 的状态:状态机、阶段守卫、交接、归档这些核心逻辑由 7 个 Bash 脚本承担。逻辑本身没问题,但”必须有一个兼容 Bash 的 shell”这个前提,把相当一部分用户挡在了门外。Windows 上要么装 Git Bash,要么用 WSL;路径转义、shell 差异、可执行权限丢失(macOS 上那个经典的 100644100755 问题)都是反复出现的隐患。 0.4.0 的决策:把所有脚本重写为 Node .mjs 启动器,背后由一份共享的 TypeScript 运行时(domains/comet-classic/)支撑。每个 .mjs 是一个自包含的 esbuild 单文件包,把 yaml 等依赖一并内联。 为什么这样改
动机0.3.90.4.0
跨平台Windows 需要 Git Bash/WSL仅需 Node.js 20+
路径可靠性shell 转义、CRLF、可执行位Node 原生处理
实现一致性散落的 shell 逻辑单一 TypeScript 转移语义表
关键在于”单一转移语义表”:comet-state transitioncomet-guard --apply 现在共享同一份 classic-transitions.ts,所以两条推进路径的行为完全一致,不会再出现”guard 放行了但 state 拒绝”这种不一致。
对老用户来说最重要的承诺:所有 /comet* 命令的行为不变。你不需要改用法,底层从 Bash 换成了 Node,但工作流还是那条工作流。

二、为什么做路由上下文(Routing Context)

0.3.9 的状态/comet 入口靠 Skill 正文里一段自然语言规则判断该走 full/hotfix/tweak。问题是这段规则不可解释、不可复核、不可恢复。路由错了,你不知道是哪个信号出了问题;中断后重新进来,Agent 只能重新猜一次。 0.4.0 的决策:把”用户想干什么”变成一份结构化路由上下文(实现类型名为 CometIntentFrame),再由运行时按固定优先级重新评分,给出可解释的最终路由。 为什么这样改:核心矛盾是”信任问题”。旧做法信任 Agent 自己提的路由建议;新做法不信任建议,只信任证据——运行时拿路由上下文里的置信度、风险信号、仓库上下文重新算一遍,和 Agent 的建议不一致时,把分歧写进诊断日志。 最体现这个设计的是风险信号优先于口头流程:你说”走 hotfix”,但如果命中了 public_api_change,运行时会停下来问你,而不是放行一个影响外部契约的轻量流程。这是 Comet 的安全底线——宁可多问一句,不替你赌一条高风险的近路。 详见意图识别与路由

三、为什么要有 /comet-any:让每个人都能造出好用的 Skill

前面两项是把已有能力改得更稳。从这一节开始,是 0.4.0 全新补上的能力 0.3.9 的状态:用户只能消费 Comet 预置的 /comet 系列命令。你想做一个自己的工作流 Skill?做不了。想把 brainstorming + writing-plans + systematic-debugging + verification-before-completion 这几个 Skill 组合成一个”团队 PR 评审助手”打包分发?Comet 完全没有这条路径——它只是一个被消费的工作流,不是一个能产出 Skill 的工厂。 0.4.0 的决策/comet-any 不是一个提示词生成器,而是一个完整的 Skill 创作平台。它解决的核心问题是——组合任意 Skill,让用户能造出和 Comet 自己一样好用的 Skill 为什么必须是平台而不是脚本:因为”造一个可复用、可分发、可评审的 Skill 包”和”写一段提示词”根本不是一回事。一个能和 /comet 平起平坐的 Skill,需要:
  1. 确定性骨架——路由表、运行时脚本、manifest 必须可复现,不能每次生成都变;
  2. 可评审的创作内容——入口的决策核心、节点的指导是 LLM 写的,但必须能被人审、被证据门禁;
  3. 发布证据链——eval 证据绑定当前 draft hash,人工批准绑定当前 hash,分发前强制预览。
所以 /comet-any 的产出是一个稳定的组合 Skill Bundle,而不是一个 SKILL.md
<bundle-draft>/
  bundle.yaml
  skills/<entry-skill>/
    SKILL.md                    # 用户真正调用的入口
    comet/
      skill.yaml                # 内部运行计划
      guardrails.yaml           # 由偏好和风险策略生成的约束
      checks.yaml               # 运行完成度检查
      eval.yaml                 # Eval manifest
    reference/
      resolved-skills.json      # 真实 Skill 来源、hash、选择证据
      composition-report.md     # 组合方案、偏离解释、风险
    scripts/                    # 稳定推进流程的控制面
  rules/
  hooks/
这条主线普通用户只需要记住一句话:
/comet-any 创建 -> comet eval 验证 -> comet creator status/next
  -> comet publish review/approve/run -> comet publish distribute --preview
  -> comet publish distribute
/comet-any 还会读取项目级偏好(.comet/skill-preferences.yaml):你希望优先复用哪些 Skill、缺失和歧义时怎么办、允不允许 scripts/hooks。它必须先展示组合方案给你确认,你点头之后才写 Bundle draft——这是”可评审”的起点。 详见Skill Creator 完整流程

四、为什么 eval 是整个演进方向的决定者

/comet-any 解决了”造得出来”,但造得出来不等于造得好。如果没人能量化一个 Skill 到底好不好,改进就只能凭感觉,Skill 就没有可靠的演进方向。comet eval 就是补上这块空白的新系统,它是 Comet 的 Skill 能否发布、该往哪个方向演化的决定者。 0.3.9 的状态:Skill 好不好全凭感觉。你写了个工作流 Skill,团队成员用不用得上、稳不稳定、token 花得值不值——没有量化手段,也没有”能不能发布”的客观门槛。 0.4.0 的决策comet eval 是基于 pytest 的 Skill 评估框架,它不只是”跑一下看通不通过”,而是用一套指标体系把”好不好”这件事拆成可对比的数字。 为什么 eval 决定演进方向:因为 eval 的结果直接绑进发布门禁——没有当前 draft hash 的 eval 证据、eval 失败、或 eval 证据对的是旧 hash,都不得 publish。换句话说,eval 是 Skill 从草稿走向分发的必经关卡,它的打分维度就是 Skill 该往哪使劲的罗盘。 eval 用两个关键指标区分”能力”和”可靠性”:
指标含义回答的问题
pass@k(能力上限)k 次独立尝试里至少成功一次的概率”这个 Skill 能不能做到?“
pass^k(可靠性下限)k 次独立尝试里全部成功的概率”能不能每次都做到?”
为什么两个都要?因为对工作流类 Skill——用户会反复跑的东西——可靠性比能力更重要pass@k 高、pass^k 低意味着”偶尔能做对,但不能指望每次都做对”,这个间隙(pass@k − pass^k)就是最关键的质量信号:高能力 + 低可靠性的 Skill,下一步该投在”稳定”而不是”加功能”。 为了让不同类型的 Skill 按匹配的维度打分而不是一刀切,eval 提供三套 rubric:
Profile用途维度
generic任意 Skill7 维度(完成度、Skill 调用、产物、指令遵循、交互、效率、安全边界)
comet-workflowComet 工作流9 维度(含主流程证据、阶段守卫、规格漂移、可恢复性)
authoring-skill/comet-any 生成包11 维度
失败时,eval 还会做失败归因,把失败分到四个桶里,告诉你下一步该修什么:
  • harness——多半是 eval 环境、Docker、路径问题;
  • workflow——多半是 Skill 执行流程没达到预期(该修 Skill);
  • task——多半是任务定义、验证条件问题;
  • model——多半是模型行为、工具使用不稳定。
普通用户两步走:先 --collect 做低成本发现预检查,再 --html 跑真实评估拿可浏览报告。
comet eval ./generated-skill/comet/eval.yaml --collect
comet eval ./generated-skill/comet/eval.yaml --html
详见评估任意 Skill

五、为什么要有 Dashboard:让产物管理看得见

Skill 造出来了、也评估过了,但一个变更在跑的过程中会产出大量产物——proposal、design、tasks、plan、verifyReport、handoff、checkpoint……0.3.9 时这些东西散落在 openspec/changes/docs/superpowers/.comet/ 不同目录里,想看一个变更现在到哪一步、产出了什么、是不是卡住,只能去翻文件。comet dashboard 就是补上这个空白的新系统:给产物的文档管理一个可视化平台。 0.3.9 的状态:没有可视化手段。诊断一个卡住的变更意味着逐个打开 YAML、找到指针、跳到对应目录自己拼出全貌。 0.4.0 的决策comet dashboard 启动一个本地只读浏览器界面,把每个变更的全貌放进一块面板。 为什么是”产物管理可视化”:dashboard 把所有产物按来源分成三组,让你一眼看清一个变更该有什么、已经有了什么、还缺什么:
分组产物来源
OpenSpecproposal、design、tasks、deltaSpec变更目录内的规格文件
SuperpowersdesignDoc、plan、verifyReportdocs/superpowers/ 下的设计/计划/审查证据
Comet.comet.yaml、handoff、checkpoint、brainstorm、subagentProgress.comet/ 里的中间产物
每个产物会标记状态——已生成(可预览)、未生成(预期但还没创建)、无需生成(当前模式/阶段不适用)。这把”这个变更的产物齐不齐”从翻文件变成了看面板。 除了产物,dashboard 还在同一块面板上呈现阶段进度、任务进度、verify 状态、下一步动作建议、风险信号和 Git 上下文。同一份快照还能被脚本和 CI 消费:
comet dashboard . --json          # 输出一次快照,用于脚本/CI
comet dashboard . --port 4399     # 指定端口
GET /api/dashboard                # HTTP 接口,同一份快照
eval 和 dashboard 共享同一个运行时证据路径——comet statuscomet doctor 报告的问题,就是脚本实际会拦截的问题。这让 Comet 的”可恢复性""可观测性”从口号变成了可验证的承诺。 详见 Dashboard 概览

六、状态为什么拆成三层

0.3.9 的状态:所有状态塞在一个 .comet.yaml 里——用户可读的工作流字段和机器管理的运行态检查点混在一起。结果是用户容易误改机器字段,机器字段变化也污染了人类可读的投影。 0.4.0 的决策:每个变更的状态拆成三层:
文件归属内容
.comet.yaml用户可读工作流投影(workflow/phase 等)+ run_id 链接
.comet/run-state.json机器管理运行态检查点:当前步骤、迭代、待处理动作
.comet/state-events.jsonl追加式审计成功转移的完整记录
为什么这样改:单一职责。用户能直接看懂”现在在哪个阶段”,但碰不到机器字段;机器字段由运行时原子写入,comet-state set 会拒绝直接写它们;审计日志只追加不覆盖,给你一条可追溯的状态历史。旧变更首次读取时自动迁移,无需手动处理。

这一切指向什么

如果把这六项放在一起看,0.4.0 的主线很清晰:Comet 从一个”工作流层”变成了一个”工作流 + Skill 平台”,而这三件事互为支撑、形成闭环:
  • 造得出——/comet-any 让每个人都能把任意 Skill 组合成和 Comet 一样好用的可复用包;
  • 量得出——comet eval 让 Skill 效果可量化,并作为发布门禁决定 Skill 往哪个方向演化;
  • 看得见——comet dashboard 让产物的文档管理有了一块可视化面板。
下面三件事把平台托稳:
  • 运行时跨平台了(Node),所以平台能落地到更多环境;
  • 路由可解释了(路由上下文),所以平台的行为可信任;
  • 状态分层了,所以平台可恢复、可审计。
0.3.9 解决了”怎么让一条工作流可恢复”;0.4.0 解决了”怎么让工作流和 Skill 成为一个能创作、能量化、能看清、可信赖、可扩展的平台”。这是这一次大版本跃迁真正想做的事。
想看完整的逐条变更,见 0.4.0-beta.1 changelog
最后修改于 2026年7月2日