From 2a249107903434e0a4e93e834509093e0a1d6a3f Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 27 Jul 2026 17:30:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(worklog):=20=E4=BF=AE=E6=AD=A3=20auto=20?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=9A=84=20CLI=20=E5=88=A4=E6=96=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- scripts/worklog/worklog.sh | 39 +++++++++++++++++++++++++++++++++++--- skills/worklog/SKILL.md | 2 +- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 087c023..7bcc947 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ doc/ | `worklog` 手動模式 | ✅ | ⚠️ 需安裝後保留 `scripts/` | ⚠️ 同左 | ⚠️ 需完整 plugin 目錄 | ⚠️ 需安裝後保留 `scripts/` | | 摘要 CLI | `claude -p` | `codex exec` | `agy -p` | `opencode run` | `copilot -p` | -`worklog` 自動記錄仍依賴相容的 Stop hook 與 transcript JSONL 結構;Claude Code 會用 `CLAUDE_PLUGIN_ROOT` 定位腳本,Codex 會從 `~/.codex/plugins/cache/doc/jsc` 找已安裝的 worklog 腳本並解析 Codex session JSONL。摘要執行器可用 `WORKLOG_CLI=auto|claude|codex|agy|opencode|copilot` 指定,預設依 README 的 headless CLI 順序自動挑選已安裝工具。 +`worklog` 自動記錄仍依賴相容的 Stop hook 與 transcript JSONL 結構;Claude Code 會用 `CLAUDE_PLUGIN_ROOT` 定位腳本,Codex 會從 `~/.codex/plugins/cache/doc/jsc` 找已安裝的 worklog 腳本並解析 Codex session JSONL。摘要執行器可用 `WORKLOG_CLI=auto|claude|codex|agy|opencode|copilot` 指定;預設 `auto` 會先依目前 hook/session 環境判斷正在使用的 CLI,判斷不到或該 CLI 不可執行時才 fallback 到已安裝工具。 --- diff --git a/scripts/worklog/worklog.sh b/scripts/worklog/worklog.sh index aa47770..1b01cae 100755 --- a/scripts/worklog/worklog.sh +++ b/scripts/worklog/worklog.sh @@ -3,7 +3,7 @@ # 用途:工作證明自動記錄(worklog)。由支援 hook 的 CLI 觸發, # 抽出本輪工作內容 → 呼叫已安裝 CLI 濃縮成精簡條目 → 機密遮蔽 → # 追加到 Gitea wiki 的當週工作紀錄頁。工作內容全程不落地。 -# 更新時間:2026/07/27 22:16:00 +# 更新時間:2026/07/27 17:27:54 # 相依:python3、README 定義的任一 headless CLI、curl(wiki 走 Python urllib,不需 curl 亦可)。 # 機密:token 僅由環境變數/本機憑證讀取,不 echo、不寫檔;輸出前套用遮蔽規則。 # 退出碼:一律 0 —— hook 絕不可阻斷使用者的工作流程。 @@ -51,8 +51,8 @@ die_quiet() { command -v python3 >/dev/null 2>&1 || die_quiet "找不到 python3,略過記錄" "WRN" select_worklog_cli() { - # 依 README 定義的 headless CLI 選擇摘要執行器;可用 WORKLOG_CLI 強制指定。 - local requested="${WORKLOG_CLI:-auto}" cli + # 依目前 hook/session 環境優先選擇摘要執行器;可用 WORKLOG_CLI 強制指定。 + local requested="${WORKLOG_CLI:-auto}" cli current_cli if [ "$requested" != "auto" ]; then case " ${SUPPORTED_CLIS} " in *" ${requested} "*) ;; @@ -62,6 +62,14 @@ select_worklog_cli() { printf '%s' "$requested" return 0 fi + current_cli="$(detect_current_cli)" + if [ -n "$current_cli" ]; then + if command -v "$current_cli" >/dev/null 2>&1; then + printf '%s' "$current_cli" + return 0 + fi + log "WRN" "目前環境判定為 ${current_cli},但找不到 ${current_cli} CLI,改用可用摘要 CLI" + fi for cli in $SUPPORTED_CLIS; do if command -v "$cli" >/dev/null 2>&1; then printf '%s' "$cli" @@ -71,6 +79,31 @@ select_worklog_cli() { die_quiet "找不到可用摘要 CLI(需要其一:${SUPPORTED_CLIS})" "WRN" } +detect_current_cli() { + # 判斷實際觸發本輪 hook 的助理環境,避免 auto 因 PATH 順序誤顯其他 CLI。 + if [ -n "${CODEX_THREAD_ID:-}" ] || [ -n "${CODEX_CI:-}" ] || [ -n "${CODEX_MANAGED_PACKAGE_ROOT:-}" ]; then + printf 'codex' + return 0 + fi + if [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] || [ -n "${CLAUDE_CODE_SSE_PORT:-}" ]; then + printf 'claude' + return 0 + fi + if [ -n "${AGY_SESSION_ID:-}" ] || [ -n "${AGY_WORKSPACE_ID:-}" ]; then + printf 'agy' + return 0 + fi + if [ -n "${OPENCODE_SESSION_ID:-}" ] || [ -n "${OPENCODE_CONFIG:-}" ]; then + printf 'opencode' + return 0 + fi + if [ -n "${COPILOT_AGENT_ID:-}" ] || [ -n "${GITHUB_COPILOT_TOKEN:-}" ]; then + printf 'copilot' + return 0 + fi + return 0 +} + run_summary_cli() { # 各 CLI 依 README 的 headless 指令呼叫;不把工作內容寫入檔案。 local cli="$1" prompt="$2" model="$3" diff --git a/skills/worklog/SKILL.md b/skills/worklog/SKILL.md index 8928342..a0282a7 100644 --- a/skills/worklog/SKILL.md +++ b/skills/worklog/SKILL.md @@ -75,7 +75,7 @@ WORKLOG_DIR="/../../scripts/worklog" | `WORKLOG_HOST` | ✅ | Gitea 主機,如 `gitea.housefun.com.tw` | 不啟用 | | `WORKLOG_REPO` | ✅ | wiki 所在 repo,如 `H3285/WorkLog` | 不啟用 | | `WORKLOG_MODEL` | | 強制指定摘要模型 | 讀快取檔 → 保底 `claude-haiku-4-5-20251001` | -| `WORKLOG_CLI` | | 摘要執行器:`auto`/`claude`/`codex`/`agy`/`opencode`/`copilot` | `auto`,依序挑 `claude`→`codex`→`agy`→`opencode`→`copilot` | +| `WORKLOG_CLI` | | 摘要執行器:`auto`/`claude`/`codex`/`agy`/`opencode`/`copilot` | `auto`,先依目前 hook/session 環境判斷正在使用的 CLI,判斷不到或該 CLI 不可執行時才 fallback 到已安裝工具 | | `WORKLOG_SCOPE` | | 冒號分隔的路徑前綴,僅這些路徑下的 session 才記 | 全部 session 都記 | | `WORKLOG_ERRLOG` | | 錯誤訊息額外寫入的檔案路徑(只記錯誤、不含工作內容) | 只走 stderr |