hooks 0.1.7 發佈:安裝先全清、出錯轉修正、工作包 PR 閘門 #19

Merged
admin merged 8 commits from develop into master 2026-08-25 11:09:29 +00:00
Member

hooks 0.1.7 發佈:安裝先全清、出錯轉修正、工作包 PR 閘門

摘要

  • 需求描述:把 develop 累積的 jsc-hooks 0.1.7 發佈到預設分支 master。marketplace 從預設分支取,所以這一步之前,五個 CLI 抓到的都還是 0.1.5 的舊版。內容分兩批:①hooks-install 的兩條規則——hook 只要有錯誤(接線失敗或執行期錯誤)就轉 jsc-hooks:repair 修正並 PR 到 develop;安裝一律先移除該 CLI 的所有 hook(含非 jsc 的第三方 hook),備份之後只重新安裝 jsc 的 hook 技能組。②sdlc-gate.sh 的工作包 PR 閘門——wp-lock、wp-unlock、wp-report、wp-check,讓「PR 沒合併就禁止進下個工作包」變成程式層強制規則。repair 技能本體已在 master。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
tools/wire-cli.sh 新增 purge {cli}(備份後移除該 CLI 全部 hook)與 smoke {cli}(五支 hook 各跑一次驗執行期)。原有接線行為與回報格式不動。
tools/scan-hook-errors.sh 新檔。掃 claude 原生紀錄裡的 hook 執行期錯誤,另外四個 CLI 沒有等價紀錄就回 unavailable。每筆標上 jsc 欄位,分得出該不該轉修正。
skills/hooks-install/SKILL.md 流程改為七步:purge、接線、smoke、scan、報錯轉修正、回報。兩條規則寫進步驟的完成條件,description 一併改寫。
README.md 工具表補 scan-hook-errors.sh、改寫 wire-cli.sh 的三個用法;技能說明改成四道關卡;環境變數表補 JSC_CLAUDE_SETTINGS_DIR。
hooks/sdlc-gate.sh 新增 wp-lock、wp-unlock、wp-report、wp-check {prompt|skill} 四個子命令,狀態檔 $JSC_HOME/wp/ 刻意不綁工作階段。另外把檔頭的 read_stdin 改成只在需要的子命令才讀,避免工具腳本轉呼叫時卡死。
hooks/hooks.json UserPromptSubmit 接上 wp-check prompt,PreToolUse(matcher Skill)接上 wp-check skill。
plugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json 三份 manifest 同步 0.1.5 → 0.1.7(兩批各升一次),版本前置檢查才認得新工具。

設計重點

  • 移除邏輯下放到 wire-cli.sh purge 子命令,規則寫在程式碼裡才驗得到行為,技能只判讀 status= 那一行。
  • 備份先行:$JSC_HOME/backup/hooks/{cli}/{yyyyMMdd_HHmmss}/,備份失敗就不移除,驗證沒過自動還原。
  • 沒有 jq 也刪得掉 JSON 鍵(awk 逐字元追蹤引號與括號深度),因為目標機器不保證裝了 jq。
  • codex 只移除根層 notify,profile 層底下的使用者設定保留。
  • claude 的其他 plugin 自帶 hooks.json,purge 動不到,輸出直接講明,不假裝已清乾淨。
  • 執行期偵測依各 CLI 條件分兩路:只有 claude 有 hook 結果紀錄,另外四支靠 smoke 主動跑一輪,回報時 unavailable 就講 unavailable。
  • 第三方 hook 的錯誤只回報不轉修正,靠 jsc 欄位分流。

測試結果

  • 兩支腳本 sh -n 通過;無參數與錯誤 CLI 名一律 exit 2。
  • purge claude 在設定檔複製品上跑過:hooks 鍵刪除、其他鍵完整、備份與原檔位元組相同、重跑冪等。
  • 壞掉的 JSON 拒絕處理並 exit 4,還原備份,原檔沒動。
  • purge codex 在假 HOME 跑過:根層 notify(含第三方)移除,[profiles.dev] 的保留,第三方 rc 段落保留。
  • smoke claude 五支 hook 全 exit 0。
  • scan-hook-errors.sh --cli claude 掃到 30 筆(27 筆 hook_non_blocking_error 加 3 筆非空 hookErrors,與 grep 計數一致),全部 jsc=false;另以 fixture 驗證 jsc=true 判定正確。四個非 claude 的 CLI 都回 unavailable。
  • 真實環境未受影響:~/.claude/settings.json、~/.bashrc、~/.codex/config.toml 全程未被修改。
  • meta/tools/ste100-lint.sh hooks 通過,無簡體字,無半形標點誤用。
  • 工作包閘門:沙箱 JSC_HOME 下驗過完整情境——wp-check prompt 有鎖也一律 exit 0(只注入提醒);wp-check skill 對 plan、analyze、maintain exit 2,對 implement 與其他技能 exit 0,取不到技能名放行;JSC_WP_GATE=off 全部放行;wp-unlock 冪等且只清對應那一筆。既有 lock、check、report 行為回歸測試通過。
  • wire-cli.sh smoke claude 七個接線模式全 exit 0;刻意帶 JSC_SKILL=jsc-sdlc:plan 且有未結清 PR 時仍 exit 0。
  • 真實 ~/.jsc 未被寫入任何 wp/ 檔案。
  • 上游 PR #18、#20 都已於 2026-08-25 合併進 develop(合併 commit 291909c、88c7d37)。

前置 Push Request

  • 無
# hooks 0.1.7 發佈:安裝先全清、出錯轉修正、工作包 PR 閘門 ## 摘要 - 需求描述:把 `develop` 累積的 `jsc-hooks` 0.1.7 發佈到預設分支 `master`。marketplace 從預設分支取,所以這一步之前,五個 CLI 抓到的都還是 0.1.5 的舊版。內容分兩批:①`hooks-install` 的兩條規則——hook 只要有錯誤(接線失敗或執行期錯誤)就轉 `jsc-hooks:repair` 修正並 PR 到 `develop`;安裝一律先移除該 CLI 的所有 hook(含非 jsc 的第三方 hook),備份之後只重新安裝 jsc 的 hook 技能組。②`sdlc-gate.sh` 的工作包 PR 閘門——`wp-lock`、`wp-unlock`、`wp-report`、`wp-check`,讓「PR 沒合併就禁止進下個工作包」變成程式層強制規則。`repair` 技能本體已在 `master`。 - 計畫名稱:無 - 計畫頁:無 - 分析頁:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `tools/wire-cli.sh` | 新增 `purge {cli}`(備份後移除該 CLI 全部 hook)與 `smoke {cli}`(五支 hook 各跑一次驗執行期)。原有接線行為與回報格式不動。 | | `tools/scan-hook-errors.sh` | 新檔。掃 claude 原生紀錄裡的 hook 執行期錯誤,另外四個 CLI 沒有等價紀錄就回 `unavailable`。每筆標上 `jsc` 欄位,分得出該不該轉修正。 | | `skills/hooks-install/SKILL.md` | 流程改為七步:purge、接線、smoke、scan、報錯轉修正、回報。兩條規則寫進步驟的完成條件,`description` 一併改寫。 | | `README.md` | 工具表補 `scan-hook-errors.sh`、改寫 `wire-cli.sh` 的三個用法;技能說明改成四道關卡;環境變數表補 `JSC_CLAUDE_SETTINGS_DIR`。 | | `hooks/sdlc-gate.sh` | 新增 `wp-lock`、`wp-unlock`、`wp-report`、`wp-check {prompt|skill}` 四個子命令,狀態檔 `$JSC_HOME/wp/` 刻意不綁工作階段。另外把檔頭的 `read_stdin` 改成只在需要的子命令才讀,避免工具腳本轉呼叫時卡死。 | | `hooks/hooks.json` | `UserPromptSubmit` 接上 `wp-check prompt`,`PreToolUse`(matcher `Skill`)接上 `wp-check skill`。 | | `plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` | 三份 manifest 同步 0.1.5 → 0.1.7(兩批各升一次),版本前置檢查才認得新工具。 | ## 設計重點 - 移除邏輯下放到 `wire-cli.sh purge` 子命令,規則寫在程式碼裡才驗得到行為,技能只判讀 `status=` 那一行。 - 備份先行:`$JSC_HOME/backup/hooks/{cli}/{yyyyMMdd_HHmmss}/`,備份失敗就不移除,驗證沒過自動還原。 - 沒有 `jq` 也刪得掉 JSON 鍵(awk 逐字元追蹤引號與括號深度),因為目標機器不保證裝了 `jq`。 - codex 只移除根層 `notify`,profile 層底下的使用者設定保留。 - claude 的其他 plugin 自帶 `hooks.json`,purge 動不到,輸出直接講明,不假裝已清乾淨。 - 執行期偵測依各 CLI 條件分兩路:只有 claude 有 hook 結果紀錄,另外四支靠 `smoke` 主動跑一輪,回報時 `unavailable` 就講 `unavailable`。 - 第三方 hook 的錯誤只回報不轉修正,靠 `jsc` 欄位分流。 ## 測試結果 - 兩支腳本 `sh -n` 通過;無參數與錯誤 CLI 名一律 exit 2。 - `purge claude` 在設定檔複製品上跑過:`hooks` 鍵刪除、其他鍵完整、備份與原檔位元組相同、重跑冪等。 - 壞掉的 JSON 拒絕處理並 exit 4,還原備份,原檔沒動。 - `purge codex` 在假 HOME 跑過:根層 `notify`(含第三方)移除,`[profiles.dev]` 的保留,第三方 rc 段落保留。 - `smoke claude` 五支 hook 全 exit 0。 - `scan-hook-errors.sh --cli claude` 掃到 30 筆(27 筆 `hook_non_blocking_error` 加 3 筆非空 `hookErrors`,與 grep 計數一致),全部 `jsc=false`;另以 fixture 驗證 `jsc=true` 判定正確。四個非 claude 的 CLI 都回 `unavailable`。 - 真實環境未受影響:`~/.claude/settings.json`、`~/.bashrc`、`~/.codex/config.toml` 全程未被修改。 - `meta/tools/ste100-lint.sh hooks` 通過,無簡體字,無半形標點誤用。 - 工作包閘門:沙箱 `JSC_HOME` 下驗過完整情境——`wp-check prompt` 有鎖也一律 exit 0(只注入提醒);`wp-check skill` 對 plan、analyze、maintain exit 2,對 implement 與其他技能 exit 0,取不到技能名放行;`JSC_WP_GATE=off` 全部放行;`wp-unlock` 冪等且只清對應那一筆。既有 `lock`、`check`、`report` 行為回歸測試通過。 - `wire-cli.sh smoke claude` 七個接線模式全 exit 0;刻意帶 `JSC_SKILL=jsc-sdlc:plan` 且有未結清 PR 時仍 exit 0。 - 真實 `~/.jsc` 未被寫入任何 `wp/` 檔案。 - 上游 PR #18、#20 都已於 2026-08-25 合併進 `develop`(合併 commit `291909c`、`88c7d37`)。 ## 前置 Push Request - 無
jiantw83 added 4 commits 2026-08-25 10:22:35 +00:00
admin added 4 commits 2026-08-25 11:03:26 +00:00
jiantw83 changed title from hooks 0.1.6 發佈:安裝先全清、出錯轉修正 to hooks 0.1.7 發佈:安裝先全清、出錯轉修正、工作包 PR 閘門 2026-08-25 11:05:00 +00:00
admin approved these changes 2026-08-25 11:09:26 +00:00
admin merged commit 829ea50770 into master 2026-08-25 11:09:29 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Reference: plugins/hooks#19