Community写作与编辑github.com

2JIHAN/show-me-your-eta

让编码智能体告诉你本轮任务何时完成,并随着每一轮不断优化估算精度。

show-me-your-eta 是什么?

Turn-ETA 是一种智能体技能,要求编码智能体(如 Claude Code、Cursor、Codex 等)在开始工作前先列出步骤并预估完成时间,随后在实际执行中记录每步耗时,并在结束时给出实际用时。该技能支持所有主流 AI 编码平台,通过记录每轮任务的步骤耗时,利用中位数算法逐步提升估算准确性。其工作原理是:调用 `plan` 命令生成编号步骤和 ETA,每完成一步调用 `step` 记录耗时,全部完成则调用 `done` 记录实际时间。系统会按提供商、模型和任务规模分级记录历史数据,并智能融合历史中位数与当前进度进行动态重估。该技能可有效提升项目管理透明度,帮助开发者更好地规划时间。

兼容平台✓Claude Code✓Codex CLI~Cursor✓Gemini CLI
npx skills add 2JIHAN/show-me-your-eta

Installed? Explore more 写作与编辑 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

turn-eta——预测本轮任务何时完成,并从实际耗时中学习

在开始工作之前,将步骤写为编号列表,并说明何时完成。每完成一步,计时该步骤。本轮结束时,用实际完成时间结束回复。下一次估算将读取日志。

何时运行

每一轮包含实际工作的对话——编辑文件、运行命令、搜索代码库。

  • 本轮包含实际工作 → 在 开始前 调用 plan,并在回复开头打印它输出的内容,按输出顺序:首先是 **ETA …** 行,单独一行,然后是编号步骤。完成时间是读者最关心的;下面的步骤是推理过程。每完成一步调用 step <id>,本轮工作完成时调用 done <id>。
  • 最后一段也是时间,具体是哪一种取决于是否仍有任务在运行。
    • 所有工作在回复写出前已完成 → 整个 done 块输出:来自 done 的完成时间。此时 ETA 已经过期;重复打印只会给读者一个已被时间证伪的猜测,而每步耗时则显示了问题出在哪里。
    • 仍有任务在运行(后台作业、委托任务)→ 预报:**ETA 17:45**。在写出回复时重新计算,切勿粘贴 plan 先前打印的数字。
  • 纯对话轮(回答问题、决定构建内容)→ 不做任何事。那是噪音。
  • 一行代码的修复也不值得这一套仪式。当步骤多于一个时再使用。

命令

纯 Node.js,无需安装。从技能安装目录调用。

# 工作开始前——列出步骤并获取 ETA
node <skill>/scripts/eta.js plan \
  "复现故障" "修复日期解析器" "更新测试数据" "重新运行测试套件" \
  --provider anthropic --model claude-opus-5 --size M

# **ETA 17:45**(14 分钟)
#
# 1. 复现故障
# 2. 修复日期解析器
# 3. 更新测试数据
# 4. 重新运行测试套件
#
# 4 个步骤,约 14 分钟(来自 anthropic/claude-opus-5 M 的每步 3.5 分钟,6 轮)
#
# (最近 6 次估算偏长了 3 分钟)
# turn id: 48i35qek

# 每完成一步——计时,并根据实际进度重新预报剩余时间
node <skill>/scripts/eta.js step 48i35qek
# 2/4 修复日期解析器 — 8 分 06 秒
#
# **ETA 17:49**(4 分钟后)

# 当本轮工作完成时
node <skill>/scripts/eta.js done 48i35qek
# **完成时间 17:48**(预估 14 分钟 / 实际 17 分钟)

# 查看当前日志内容
node <skill>/scripts/eta.js stats

请命名步骤,不要只计数。 plan 拒绝纯数字。无法验证的计数不是计划——命名步骤可以让阅读的人在你开始前说“跳过第 3 步”。将编号列表放在回复顶部,然后再开始工作。

你必须传递自己的 --provider 和 --model。 Shell 无法知道是哪个模型在驱动。使用你自己知道的标识符——--provider anthropic --model claude-opus-5、--provider openai --model gpt-5-codex、--provider google --model gemini-3-pro。缺失任何一项都会归入 unknown/unknown,虽然仍然可用,但会将所有模型的数据混在一起。

--size 是 S(小修复)、M(普通,默认值)或 L(大块任务)。大致估计即可;它只防止小任务拉大任务平均值的后腿。

turn id 是必需的。 plan 会打印一个;请在所有 step 和最后的 done 中携带它——step 48i35qek、done 48i35qek。同一个项目中的另一个智能体也会写入同一个日志,因此没有 id 的调用曾经会关闭恰好打开的任意一个轮次——可能是别人的。step 和 done 现在拒绝没有 id 的调用。超过四小时无人触碰的轮次将被视为已放弃。

日志存储位置

<project root>/.eta/<provider>/<model>/log.tsv

位于项目内部,因此权限仅限于工作目录的智能体仍然可以读取自己的历史记录。项目根目录是向上查找最近的 .git,否则是当前目录。提供商和模型作为文件夹名称,因此一个模型的节奏不会悄悄变成另一个模型的。

将 .eta/ 添加到 .gitignore。它是对你机器在你轮次上的度量;对其他人毫无意义,并且在每个轮次中都会变化。

设置 TURN_ETA_DIR 指向另一个 .eta 目录,可以在项目间共享历史记录。仅当本地日志数据太少无法作出合理估算时才会查询它。

估算如何变得更准确

done 记录估算值、实际值以及每步耗时。plan 读取这些记录,并取 每步中位时间,从最精确的匹配层级向外扩展,在第一个至少有 3 个已完成轮次的层级停止:

  1. 当前提供商 + 模型 + 相同规模
  2. 当前提供商 + 模型
  3. 当前提供商,任意模型
  4. 本项目 .eta 中的所有数据
  5. TURN_ETA_DIR 中的共享日志,相同顺序
  6. 否则每步 4 分钟

采用中位数而非平均数,因此一次过长的轮次不会拖累所有未来的估算。每个层级只计入最近 20 个轮次。plan 会打印使用了哪个层级,因此数字永远不会是一个谜。

在对轮次进行中,step 将该历史记录与本轮实际运行速度混合,权重取决于本轮已完成的比例:在 4 个步骤中的第 1 步时,历史记录仍占四分之三;到第 3 步时,本轮已占四分之三。一步慢不会完全接管完成时间,但会使其可见。

相关技能