Community寫作與編輯github.com

2JIHAN/show-me-your-eta

編碼代理會告訴你這個回合何時完成——而且每回合都會越估越準。

show-me-your-eta 是什麼?

這是一個用於 AI 編碼代理(如 Claude Code、Cursor、Codex 等)的專業技能,旨在讓代理在開始工作前提供 ETA(預計完成時間),並在每個回合結束後根據實際耗時進行學習和調整。技能支援 Node.js 環境,無需安裝,透過 `plan`、`step` 和 `done` 三個命令來管理回合:`plan` 根據歷史數據預估每個步驟的耗時並輸出時間線,`step` 在每個步驟完成時記錄實際時間並重新預估剩餘步驟,`done` 在回合結束時記錄總耗時。預估演算法採用分層中位數策略,從最精確的匹配(相同提供者、模型、規模)逐步尋找至少 3 筆完成記錄的層級,從而避免單次偏差影響整體預測。此技能特別適合需要時間管理的開發場景,讓團隊或使用者清楚知道代理的工作進度。

相容平台✓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 會給讀者一個已經被時鐘推翻的猜測,而每個步驟的實際時間則顯示了哪裡出了問題。
    • 仍有程式在執行(背景工作、委派任務)→ 顯示預測:**ETA 17:45**。在寫回覆時重新計算,千萬不要貼上 plan 之前輸出的數字。
  • 純對話回合(回答問題、決定要做什麼)→ 不做任何事。那是雜訊。
  • 一行就能修復的修改也不值得執行這個儀式。只有在步驟多於一個時才使用。

命令

純 Node 環境,無需安裝。從技能安裝目錄執行。

# 工作之前 — 列出步驟並取得 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
# **FINISHED 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(大型區塊)。大致估算即可;它只是避免小型回合拖累大型回合的平均值。

回合 ID 是必需的。 plan 會輸出一個回合 ID;在每次 step 和最終的 done 中都必須攜帶——step 48i35qek、done 48i35qek。在同一個專案中工作的另一個代理會寫入同一個記錄檔,因此沒有 ID 的呼叫曾經會關閉任何開啟中的回合——包括別人的回合。step 和 done 現在拒絕沒有 ID 的呼叫。超過四小時無人觸碰的回合會被視為已放棄。

記錄檔存放位置

<專案根目錄>/.eta/<provider>/<model>/log.tsv

位於專案內,因此權限僅限於工作目錄的代理仍然可以讀取自己的歷史記錄。專案根目錄是向上尋找最近的 .git 目錄,否則為當前目錄。Provider 和 model 是資料夾名稱,這樣一個模型的速度就不會默默變成另一個模型的速度。

將 .eta/ 加入 .gitignore。這是你的機器在你回合中的測量數據;對其他人沒有意義,而且每個回合都會改變。

設定 TURN_ETA_DIR 指向另一個 .eta 目錄,可以在不同專案之間共享歷史記錄。只有在本地記錄檔資料太少無法提供預估時,才會參考這個目錄。

預估如何變得更準

done 記錄了預估值、實際值以及每個步驟的時間。plan 讀取這些資料,並取每個步驟的中位數分鐘數,從最精確的匹配開始向外擴展,並在第一個至少有 3 個已完成回合的層級停止:

  1. 相同 provider + model + 相同 size
  2. 相同 provider + model
  3. 相同 provider,任何 model
  4. 這個專案 .eta 中的所有資料
  5. TURN_ETA_DIR 中的共享記錄檔,採用相同順序
  6. 否則每個步驟 4 分鐘

使用中位數而非平均數,這樣一個耗時較長的回合就不會拖累未來的所有預估。每個層級只計算最近 20 個回合。plan 會輸出它使用了哪個層級,因此數字來源永遠不是謎。

在回合進行中,step 會將該歷史資料與當前回合的實際速度混合,權重取決於當前回合完成的進度:在第 1 步(共 4 步)時,歷史資料仍佔四分之三;到第 3 步時,當前回合佔四分之三。一個緩慢的第一步會移動完成時間,但不會完全主導預估。

相關技能