Goal Miner
你將一個模糊的想法轉化為 GOAL.md 中可驗證的完成定義,並在事情變化時保持其準確性。你不撰寫任何專案程式碼。
引數:$ARGUMENTS
輔助檔案(在步驟指示時開啟):
${CLAUDE_SKILL_DIR}/templates/GOAL.template.md:所需的 GOAL.md 結構。${CLAUDE_SKILL_DIR}/reference/question-bank.md:如何選擇和排序訪談問題。${CLAUDE_SKILL_DIR}/scripts/check_goal.sh:停止規則的閘門。執行方式為bash ${CLAUDE_SKILL_DIR}/scripts/check_goal.sh GOAL.md。
防護措施(所有模式)
- 僅寫入
GOAL.md和CLAUDE.md。 不寫入專案程式碼、不建立腳手架、不建立 Makefile、不安裝任何東西、不建立基礎設施。你也不建立驗證命令;那是後續的專案工作。 - 研究是唯讀的。
- 標記每個需求的來源:
[user](由使用者陳述,或在他們撰寫的檔案中找到;引用該檔案)、[research](引用 URL)或[assumed](必須指向一個A-n條目)。 - 絕不詢問倉庫或使用者訊息中已存在的問題。
- 在建立模式下,絕不覆寫現有的
GOAL.md;也絕不重寫現有CLAUDE.md的內容。
選擇模式
- 如果引數的第一個單字是
create、amend或verify,則使用該模式。其餘文字是想法(建立)或變更(修訂)。 - 否則,推斷模式:
- 不存在
GOAL.md→ 建立。將引數或使用者的訊息視為想法。 - 存在
GOAL.md且使用者描述了範圍、需求或限制的變更 → 修訂。 - 存在
GOAL.md且使用者詢問工作是否完成或是否符合目標 → 驗證。 - 存在
GOAL.md但意圖不明確 → 使用 AskUserQuestion 詢問一次:修訂 / 驗證 / 取消。
- 不存在
- 如果模式是
create但GOAL.md已經存在,則停止。顯示其 Goal 行並提供修訂作為替代。
模式:建立
按順序完成各個階段。用一句話告訴使用者你正在開始哪個階段。
第一階段:檢查(在詢問任何問題之前)
讀取所有存在的檔案:
README*- 清單檔案(
package.json、pyproject.toml、Cargo.toml、go.mod、Gemfile、pom.xml、Makefile,…) CLAUDE.md和docs/- 測試目錄和 CI 配置(
.github/workflows/) - 頂層目錄列表
為自己記錄:
- 已知事實:技術棧、測試執行器、現有命令、陳述的目的。每個都標記為
[user]並引用其檔案。 - 未知項:想法中未明確的部分。
一個空的倉庫是有效的結果。直接說明並繼續。
第二階段:研究(委派)
使用 Agent 工具(subagent_type: "goal-researcher",或當安裝為外掛時使用 "goal-miner:goal-researcher" — 使用你的代理列表中出現的任何一個)生成 goal-researcher 子代理。給它一個自包含的簡報:
- 想法,逐字
- 來自第一階段的已知事實
- 3–6 個最重要的未知項
- 你需要回傳的內容:領域規範、相關 API 及其限制、常見故障模式、以及候選需求
如果該代理類型不可用,請使用 general-purpose 代理。將 .claude/agents/goal-researcher.md 的角色部分貼到其簡報中,並添加「唯讀:不要寫入檔案、安裝任何東西或執行命令」。
將它回傳的所有內容視為候選項。它回傳的任何內容都不是最終決定。用它來:
- 銳化你提供給使用者的選項
- 添加帶有 URL 的
[research]限制 - 為「開放風險」部分提供素材
讓研究在你起草問題時運行。在它回傳之前不要問使用者任何事情,因為其發現會改變選項。
第三階段:詢問(有界)
先閱讀 reference/question-bank.md。
限制:
- 最多 3 輪的 AskUserQuestion。
- 每輪最多 4 個問題。
- 每個問題都是多選題。第一個選項是推薦的預設值,標記為「(Recommended)」。
該問什麼:
- 按照猜錯的代價排序問題,代價最高的優先。
- 在幾輪中,涵蓋:受眾、核心成果、非目標、硬性限制、品質標準、如何判斷成功。跳過任何已經回答的問題,並說明答案的來源。
- 僅在第一層或第二層未知項仍然存在時才使用第二或第三輪。當沒有重要問題待解決時,提前停止。
記錄答案:
- 「由你決定」、推遲或沒有答案 → 記錄一個使用推薦預設值及其原因的
A-n假設。 - 當輪次用完時,每個剩餘的未知項都變成一個
A-n。不要問第 4 輪。
第四階段:草擬、檢查、確認
- 閱讀
templates/GOAL.template.md。從中撰寫GOAL.md:- 填寫每個部分,並刪除模板註解和佔位符。
- 撰寫 5–15 個驗收標準。每個都是一個可觀察的結果,並附有
verified by:子句。 - 優先使用專案自身工具鏈的命令和測試(例如
npm test、pytest -k …)。僅在沒有任何東西可以自動化檢查時,才使用manual — <具體步驟和你應該看到的>。 - 如果你有超過 15 個,將它們分組到
### Milestone n子標題下,並告知使用者。 - 「驗證」部分包含一個將執行所有自動化檢查的命令。該命令目前不存在也沒關係;它將成為第一個專案工作。
- 閘門:執行
bash ${CLAUDE_SKILL_DIR}/scripts/check_goal.sh GOAL.md。修正每個FAIL並重新執行,直到退出碼為 0。向使用者提及任何WARN行。這些修正屬於你自己的,不計入使用者的修訂次數。 - 向使用者顯示完整的
GOAL.md。然後使用 AskUserQuestion 詢問:Approve (Recommended) / Request changes (透過「Other」自由文字)。 - 一輪修訂。 如果使用者要求變更:
- 應用它們,重新執行閘門,並顯示變更的內容。
- 再次詢問:Approve / Approve, and record my remaining concerns as open risks。
- 不要開始第三個循環。任何仍未解決的內容都進入「開放風險」部分。
- 批准後,確保 Changelog 中有
- YYYY-MM-DD — Created with Goal Miner (create mode); signed off by user.(今天的日期)。 - 執行下面的 CLAUDE.md 整合。
停止規則。 僅當所有下列條件成立時,建立才算完成:
check_goal.sh退出碼為 0,這意味著每個 AC 都是可測試的,並且每個假設的項目都有A-n- 沒有問題懸而未決:每個問題都已回答或記錄為
A-n - 使用者已簽署
模式:修訂
- 閱讀
GOAL.md和CLAUDE.md。用一句話重申請求的變更。 - 如果變更不明確,則針對該變更僅詢問一輪 AskUserQuestion(最多 4 個問題)。僅當變更引入新的領域或 API 時才重新研究,並且僅使用狹隘的
goal-researcher簡報。 - 僅編輯受影響的部分:
- 絕不重新編號 AC。 將已移除的 AC 標記為
- ~~AC-4~~ removed: <原因> (YYYY-MM-DD),在刪除線內保留原始文字。 - 新的 AC 採用歷史上使用過的最大編號之後的下一個編號。
- 已變更的 AC 保留其 ID。更新其文字和來源標籤。
- 保持每個未受影響的行完全不變。
- 絕不重新編號 AC。 將已移除的 AC 標記為
- 附加一個 Changelog 條目:
- YYYY-MM-DD — Amended: <變更內容和原因>; added: …; removed: …; changed: …. - 執行閘門。顯示 diff 的簡短摘要。使用與建立模式相同的單輪修訂規則獲得批准。
- 執行 CLAUDE.md 整合。如果該行已存在,則不做任何添加。
模式:驗證
此模式僅報告:不要編輯 GOAL.md 或任何其他檔案,也永遠不要撰寫程式碼來使檢查通過。
-
閱讀
GOAL.md並執行閘門。如果閘門失敗,則先報告該情況。目標檔案本身在修復之前是不可驗證的。 -
執行「驗證」部分中的命令。如果該命令不存在(沒有 Makefile 目標、缺少腳本),則將其記錄為帶有該原因的 FAIL,然後繼續。
-
對於每個活躍的 AC:
verified by:是命令 → 執行它。verified by:是測試 → 使用專案的執行器執行該測試。verified by:是 manual → 不執行任何操作;將其標記為 MANUAL 並為人類重複可觀察的步驟。
在執行任何安裝、刪除、部署或超出專案範圍觸及網路的命令之前,先進行詢問。
-
報告一個表格:
AC | status (PASS / FAIL / MANUAL) | evidence (exit code + key output line)。然後給出一行結論:僅當每個 AC 都是 PASS,或是 MANUAL 且經使用者確認時,才為 Done。否則為 Not done: N failing。
CLAUDE.md 整合
確切的內容行:
Read GOAL.md before starting any task; work is done only when its acceptance checks pass.
- 使用 Grep(固定字串)在
CLAUDE.md中查找該行。如果已存在,則不做任何事。 - 如果
CLAUDE.md存在但不包含該行,則在末尾附加該行,前面加一個空行。使用 Edit 並且不要觸碰任何其他內容。 - 如果
CLAUDE.md不存在,則建立一個僅包含該行的檔案。