/checklist:專案進度檢查清單
/checklist 在當前目錄安裝缺少的檢查清單檔案,然後在專屬聊天中顯示。不會覆蓋或修改任何既有內容。
運作方式:
- 專案目錄即為當前目錄。所有指令都從此目錄執行。
<base>為此技能頂端顯示的「Base directory」。範本位於<base>/modelli/。- 所有指令中的路徑都需加上引號:基礎目錄和專案目錄可能包含空格。
- 按順序執行各步驟,無需確認,除非步驟中明確要求。
- 每個
grep都使用-a,因為在 Claude Code 中grep可能將非 UTF-8 檔案視為二進位檔,而無法找到實際存在的行。
步驟 1:前置檢查
- 執行
command -v node。若無輸出,寫一行文字(「需要 Node.js 18 或更新版本:請安裝後重新執行 /checklist」)並停止。 - 執行
git rev-parse --path-format=absolute --git-dir和git rev-parse --path-format=absolute --git-common-dir。若兩者結果不同,表示你位於次要工作樹:寫一行文字(「你位於工作樹中:註冊表會隨之消失。請從專案主目錄執行 /checklist」)並停止。若兩個指令都失敗,代表沒有 git:繼續進行。 - 執行
pwd -P和(cd ~ && pwd -P)。若結果相同,表示你位於家目錄:寫一行文字(「你位於家目錄:CLAUDE.md 中的區塊會影響所有專案。請在專案目錄中執行 /checklist」)並停止。
當 node 存在且當前目錄既非次要工作樹也非家目錄時,此步驟即完成。
步驟 2:檢查四個元件
不要寫任何東西。記錄每個元件是否存在:
- 註冊表:
documenti/lavori.yaml存在; - 腳本:
strumenti-locali/avanzamento/stato.mjs存在; - 區塊:
grep -aqx '## 進度檢查清單' CLAUDE.md成功(若CLAUDE.md不存在,則區塊缺失); - 排除行(僅在有 git 時):
git rev-parse --is-inside-work-tree印出true,則git rev-parse --git-path info/exclude輸出的檔案應包含精確行**/documenti/lavori.yaml和**/strumenti-locali/avanzamento/。這些僅為技能本身的檔案:專案中其他documenti/目錄仍對 git 可見。使用grep -aqxF '**/documenti/lavori.yaml' "<exclude file>"和grep -aqxF '**/strumenti-locali/avanzamento/' "<exclude file>"分別檢查。若檔案不存在,則兩行都缺失。
當你知道哪些元件缺失時,此步驟即完成。
步驟 3:專案名稱
- 若
CLAUDE.md中存在區塊,則名稱為第一次出現的「更新檢查清單於」之後、關閉引號»之前的內容。指令:grep -ao '更新檢查清單於 [^»]*' CLAUDE.md | head -1,不含前綴。若名稱存在,則不詢問。若指令無輸出或名稱為空白(使用者已修改此行),則前往第 2 點。 - 否則,使用 AskUserQuestion 提問。第一個選項(建議):目錄名稱。第二個選項:變體,即 README 中的標題
#(若存在且與目錄名稱不同),否則為目錄名稱,可能使用不同的大小寫或空格。使用者可自行輸入其他名稱。 - 若無法提問(例如在非互動模式中),則使用目錄名稱並寫一行文字說明。
當你獲得名稱(以下稱為 <PROJECT>)時,此步驟即完成。
步驟 4:安裝缺失的元件
僅執行步驟 2 中發現缺失的項目。絕不覆蓋或修改任何既有內容。
- 註冊表。 若缺失:執行
mkdir -p documenti和[ -e documenti/lavori.yaml ] || sed "s/<TODAY>/$(date +%F)/g" "<base>/modelli/lavori.yaml" > documenti/lavori.yaml(保護條件可防止覆蓋現有註冊表,即使步驟 2 判斷錯誤)。 然而,若腳本已存在,專案可能已有自己的檢查清單,並使用不同的註冊表(例如lavori.json):請先用 AskUserQuestion 詢問是否要建立documenti/lavori.yaml。第一個選項(建議):不建立。若答案為否,或無法提問,則不建立,寫一行文字說明,並跳過排除行(第 4 點),因為這些行會向 git 隱藏專案本身的檢查清單檔案。 - 腳本。 若缺失:執行
mkdir -p strumenti-locali/avanzamento和cp -n "<base>/modelli/stato.mjs" strumenti-locali/avanzamento/stato.mjs。 - CLAUDE.md 中的區塊。 若缺失:
- 讀取
<base>/modelli/claude-md.md並將所有<PROJECT>替換為專案名稱; - 執行
mktemp -d並使用檔案寫入工具將替換後的區塊寫入<tmp>/blocco.md(<tmp>為輸出的目錄); - 若
CLAUDE.md存在且非空,準備以下兩個指令作為後續動作(不讀取也不重新寫入檔案):if [ -s CLAUDE.md ] && [ -n "$(tail -c1 CLAUDE.md)" ]; then printf '\n' >> CLAUDE.md; fi(若缺少結尾換行則補上)if [ -s CLAUDE.md ] && [ -n "$(tail -n1 CLAUDE.md)" ]; then printf '\n' >> CLAUDE.md; fi(若最後一行非空則補上空白行) - 附加區塊:
cat "<tmp>/blocco.md" >> CLAUDE.md(若檔案不存在則建立)。使用者的文字絕不會被重新寫入。 - 不要使用
sed:名稱可能包含/或&。
- 讀取
- 排除行(僅在有 git 時)。令
<exclude>為git rev-parse --git-path info/exclude輸出的路徑。- 執行
mkdir -p "$(dirname "<exclude>")"。 - 若缺少結尾換行則補上:
if [ -s "<exclude>" ] && [ -n "$(tail -c1 "<exclude>")" ]; then printf '\n' >> "<exclude>"; fi。 - 對於
**/documenti/lavori.yaml和**/strumenti-locali/avanzamento/中缺失的行:執行printf '%s\n' '**/documenti/lavori.yaml' >> "<exclude>"(或'**/strumenti-locali/avanzamento/')。
- 執行
- 若無 git,寫一行警告:「此處沒有 git:小工具中的儲存庫行將保持空白。」
當每個缺失的元件都已建立時,此步驟即完成。若沒有任何缺失,則此步驟立即完成。
步驟 5:開啟檢查清單聊天
無論是安裝後還是已全部存在,都執行此步驟。
- 若
mcp__ccd_session__start_session和mcp__ccd_session_mgmt__detach_session存在於延遲工具中,使用 ToolSearch 載入它們。 - 使用以下參數呼叫
start_session:initiation:user_askedcontext:freshuse_worktree:falseeffort:low(聊天將執行腳本並組成小工具:無需與發起階段相同的工作量)title: 「檢查清單:」prompt: 「執行node strumenti-locali/avanzamento/stato.mjs並按照 CLAUDE.md 的說明顯示檢查清單」background: 「專案 的進度檢查清單:腳本為strumenti-locali/avanzamento/stato.mjs。專案的 CLAUDE.md 說明了註冊表的位置、如何顯示檢查清單以及何時更新註冊表。」
- 緊接著使用返回的 id 呼叫
detach_session:這是一個主聊天,而非子聊天。 - 若
start_session不存在(CLI)或拒絕:執行node strumenti-locali/avanzamento/stato.mjs並按照<base>/modelli/claude-md.md的說明在此聊天中顯示檢查清單:使用show_widget,若show_widget不存在則使用 Markdown 表格。 - 若
start_session成功但分離步驟缺失或拒絕,寫一行文字:「請從側邊欄使用「Detach to top level」將其分離。」 - 每次執行都會開啟一個新的聊天:不要尋找先前的聊天。
當聊天已開啟並分離,或檢查清單已在此聊天中顯示時,此步驟即完成。
步驟 6:最終訊息
寫兩到三行:
- 你添加了什麼,或者「全部已存在」;
- 警告(若有);
- 檢查清單聊天的位置。
同時說明,若要添加或關閉工作項目,只需在聊天中提及即可:CLAUDE.md 中的規則將負責更新註冊表。
當訊息已寫入時,此步驟即完成。