feat/hooks-install-purge-first-and-repair-on-any-hook-error
develop
jsc-hooks:hooks-install
jsc-hooks:repair
tools/wire-cli.sh
purge {cli}
smoke {cli}
tools/scan-hook-errors.sh
unavailable
jsc
skills/hooks-install/SKILL.md
description
README.md
scan-hook-errors.sh
wire-cli.sh
hooks-install
JSC_CLAUDE_SETTINGS_DIR
plugin.json
.claude-plugin/plugin.json
.codex-plugin/plugin.json
wire-cli.sh purge
status=purged|skipped|failed
$JSC_HOME/backup/hooks/{cli}/{yyyyMMdd_HHmmss}/
pfail
jq
hooks
notify
[profiles.dev]
hooks.json
hooks/hooks.json
hook_non_blocking_error
hookErrors
smoke
clean
jsc=true
repair
jsc=false
sdlc-gate.sh check
sh -n tools/wire-cli.sh
sh -n tools/scan-hook-errors.sh
wire-cli.sh purge claude
purge claude
wire-cli.sh purge codex
wire-cli.sh smoke claude
tools/scan-hook-errors.sh --cli claude
tools/scan-hook-errors.sh --cli {codex|copilot|antigravity|kiro}
~/.claude/settings.json
~/.bashrc
~/.codex/config.toml
meta/tools/ste100-lint.sh hooks
No dependencies set.
The note is not visible to the blocked user.
安裝一律先清空 hook,出錯就轉修正
摘要
jsc-hooks:hooks-install技能。第一條:hook 只要有錯誤就轉jsc-hooks:repair修正,不分接線失敗或執行期錯誤;此時允許中止剩下的安裝流程,但修正一定要開始,並且一定要 PR 到develop。第二條:安裝一律先移除該 CLI 的所有 hook,含非 jsc 的第三方 hook,備份之後只重新安裝 jsc 的 hook 技能組。第一條規則的收尾關卡是jsc-hooks:repair技能,它已隨 PR #16 合併進develop,本 PR 只帶三個新 commit,接在它後面。變更內容
tools/wire-cli.shpurge {cli}子命令,備份後移除該 CLI 的所有 hook,讓「先清空再安裝」這條規則落在程式碼裡而不是技能文字裡;再加上smoke {cli}子命令,五支 hook 各跑一次,補上接線驗證看不到的執行期那一半。原有的接線行為與回報格式不動。tools/scan-hook-errors.shunavailable,缺口據實講明。每筆錯誤標上jsc欄位,分得出是不是 jsc 自己的 hook,才知道該不該轉修正。skills/hooks-install/SKILL.mddescription也一併改寫,讓技能被挑中時就看得到「先全清」與「出錯轉修正」這兩件事。README.mdscan-hook-errors.sh一列、改寫wire-cli.sh一列講三個用法;hooks-install技能說明改成四道關卡的敘述;環境變數表補上JSC_CLAUDE_SETTINGS_DIR。plugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json設計重點
wire-cli.sh purge子命令,不留在技能文字裡。規則寫在程式碼裡才驗得到行為:purge 自己回報status=purged|skipped|failed,也自己重讀檔案確認鍵真的不見了,技能只要判讀那一行。$JSC_HOME/backup/hooks/{cli}/{yyyyMMdd_HHmmss}/,一次 purge 一個目錄;備份失敗就不移除,移除後驗不過就自動還原備份。移除做一半的環境比沒動過更難修,所以失敗出口pfail一律先還原再回報。jq也刪得掉 JSON 鍵。jq在目標機器上不保證存在,所以備一條純 awk 的路:逐字元掃描,追蹤引號與括號深度,字串裡的括號不算深度,hooks是最後一個成員時改刪前面那個逗號。解析不出來就 exit 1,不輸出半份檔案。notify。[profiles.dev]這類 profile 層底下的notify是使用者自己的設定,跟 hook 接線無關,逐表頭判斷後保留。TOML 的值可能是多行陣列或多行行內表,所以刪鍵要追括號深度收齊才停,只刪一行會留下孤兒括號。hooks.json,purge 動不到,只能靠移除那個 plugin 才會消失(jsc 自己的hooks/hooks.json也一樣)。這件事在 purge 的輸出裡直接講明,不假裝已經清乾淨。hook_non_blocking_error與非空hookErrors;codex、copilot、antigravity、kiro 只留工作階段與提示內容,沒記退出碼與 stderr,只能靠smoke主動跑一輪。回報時unavailable就講unavailable,不寫成clean。jsc欄位用 command 與 stderr 是否命中五支 hook 檔名來判定;jsc=true才走repair,jsc=false原樣列出來交給使用者自己處理。smoke放行一個非零退出:sdlc-gate.sh check的 exit 2 是階段鎖刻意擋下該輪提示,屬設計行為。不放行的話,每個正在上鎖的工作階段都會誤報一次失敗。JSC_CLAUDE_SETTINGS_DIR是測試用的逃生門。刪 JSON 鍵的預設目標是使用者本人的設定檔,指向一份複製品才測得動整條刪鍵流程,不必拿使用者的環境當測試場。測試結果
sh -n tools/wire-cli.sh、sh -n tools/scan-hook-errors.sh:兩支都通過語法檢查。wire-cli.sh purge claude(在設定檔複製品上跑,JSC_CLAUDE_SETTINGS_DIR指向複製品):hooks鍵確實刪除,其他鍵完整保留,備份檔與原檔位元組相同,重跑冪等。purge claude拒絕處理並 exit 4,還原備份,原檔完全沒動。wire-cli.sh purge codex(在假 HOME 跑):根層notify移除,含第三方設的值;[profiles.dev]底下的notify保留;第三方的 rc 段落保留。wire-cli.sh smoke claude:五支 hook 全部 exit 0。tools/scan-hook-errors.sh --cli claude:掃到 30 筆,27 筆hook_non_blocking_error加 3 筆非空hookErrors,與 grep 計數一致;30 筆全部jsc=false,另外以 fixture 驗證jsc=true的判定正確。tools/scan-hook-errors.sh --cli {codex|copilot|antigravity|kiro}:四個都回unavailable,並指向smoke。~/.claude/settings.json、~/.bashrc、~/.codex/config.toml全程未被修改。meta/tools/ste100-lint.sh hooks:通過,無簡體字,無半形標點誤用。前置 Push Request
jiantw83 referenced this pull request2026-08-25 10:22:34 +00:00