feat(worklog): 支援 README 定義的摘要 CLI

This commit is contained in:
Jeffery
2026-07-27 17:09:11 +08:00
parent 2abe236c35
commit 01b890c21e
8 changed files with 199 additions and 62 deletions
+18 -16
View File
@@ -1,33 +1,34 @@
---
name: worklog
description: 工作證明自動記錄(worklog)的操作與維護 skill。搭配 Claude Code 的 Stop hook,把每輪工作內容濃縮成精簡條目並追加到 Gitea wiki 的當週工作紀錄頁(Worklog-yyyy-MM-W<週>),工作內容全程不落地。提供 --init(初始化週頁與環境變數指引)、--tune(判定並快取最適合的摘要模型)、--diagnose(診斷 hook 為何沒動作)、--append(手動補寫一筆)、--show(讀當週頁回顧)五個模式。當使用者說工作證明、工作紀錄、worklog、週報自動化、把工作內容寫到 wiki、記錄到 Gitea wiki、hook 沒有寫入 wiki、補寫工作紀錄、看本週做了什麼、重新判定摘要模型,或提到 WORKLOG_ENABLEDWORKLOG_HOSTWORKLOG_REPOWORKLOG_MODELWORKLOG_SCOPE 時觸發。**僅支援 Claude CodeCodexAntigravity(需 plugin 目錄保留 scripts/);不支援 OpenCode**skills 目錄安裝不會帶入 scripts/,且自動記錄依賴 Claude Code 的 transcript 格式)。不適用於:Gitea 議題操作(用 doc-issues-synccode-issues)、專案文件化(用 doc-funcs)。
description: 工作證明自動記錄(worklog)的操作與維護 skill。搭配相容的 Stop hook,把每輪工作內容透過 README 定義的 headless CLIclaude/codex/agy/opencode/copilot濃縮成精簡條目並追加到 Gitea wiki 的當週工作紀錄頁(Worklog-yyyy-MM-W<週>),工作內容全程不落地。提供 --init(初始化週頁與環境變數指引)、--tune(判定並快取最適合的 Claude 摘要模型)、--diagnose(診斷 hook 為何沒動作)、--append(手動補寫一筆)、--show(讀當週頁回顧)五個模式。當使用者說工作證明、工作紀錄、worklog、週報自動化、把工作內容寫到 wiki、記錄到 Gitea wiki、hook 沒有寫入 wiki、補寫工作紀錄、看本週做了什麼、重新判定摘要模型,或提到 WORKLOG_ENABLEDWORKLOG_HOSTWORKLOG_REPOWORKLOG_MODELWORKLOG_CLIWORKLOG_SCOPE 時觸發。不適用於:Gitea 議題操作(用 doc-issues-synccode-issues)、專案文件化(用 doc-funcs)。
---
# worklog — 工作證明自動記錄
把「每輪做了什麼」濃縮成一則條目,追加到 Gitea wiki 的當週工作紀錄頁。**自動記錄由 Claude Code `Stop` hook 完成,不需使用者同意、不需人工觸發**;本 skill 負責自動路徑之外的人工操作:初始化、模型判定、診斷、補寫、回顧。
把「每輪做了什麼」濃縮成一則條目,追加到 Gitea wiki 的當週工作紀錄頁。**自動記錄由相容`Stop` hook 完成,不需使用者同意、不需人工觸發**;本 skill 負責自動路徑之外的人工操作:初始化、模型判定、診斷、補寫、回顧。
| 元件 | 觸發者 | 職責 |
| --- | --- | --- |
| `hooks/hooks.json``Stop` hook | harness 自動 | 每輪結束抽本輪內容 → 濃縮 → 遮蔽 → 追加到當週頁 |
| 本 skill `/jsc:worklog` | 使用者/助理手動 | `--init``--tune``--diagnose``--append``--show` |
| `scripts/worklog/worklog.sh` | 上述兩者共用 | 主流程(單一實作,避免漂移):每筆整理成六個固定欄位 |
| `scripts/worklog/worklog.sh` | 上述兩者共用 | 主流程(單一實作,避免漂移):`WORKLOG_CLI` 呼叫 headless CLI每筆整理成六個固定欄位 |
| `scripts/worklog/wiki_api.py` | 上述兩者共用 | token 解析、wiki 讀寫、append 重試、週頁命名 |
| `scripts/worklog/transcript.py` | 上述兩者共用 | 抽本輪片段、估算花費時間、機密遮蔽 |
### 各助理支援範圍
| 功能 | Claude Code | Codex | Antigravity | OpenCode |
| --- | --- | --- | --- | --- |
| `Stop` hook 自動記錄 | ✅ | ⚠️ 會載入但 no-op | ❌ | ❌ |
| `--init``--diagnose``--append``--show` | ✅ | ⚠️ 需 plugin 目錄保留 `scripts/`(安裝後請實測一次) | ⚠️ 同左 | ❌ 缺 `scripts/` |
| `--tune` | ✅ | ❌ 無 `claude-api` skill 可載入 | ❌ 同左 | ❌ |
| 功能 | Claude Code | Codex | Antigravity | OpenCode | GitHub Copilot |
| --- | --- | --- | --- | --- | --- |
| `Stop` hook 自動記錄 | ✅ | ✅ 需可讀 Codex session JSONL | ❌ | ❌ | ❌ |
| `--init``--diagnose``--append``--show` | ✅ | ⚠️ 需 plugin 目錄保留 `scripts/`(安裝後請實測一次) | ⚠️ 同左 | ⚠️ 需完整 plugin 目錄 | ⚠️ 需 plugin 目錄保留 `scripts/` |
| 摘要 CLI | `claude -p` | `codex exec` | `agy -p` | `opencode run` | `copilot -p` |
| `--tune` | ✅ | ❌ 無 `claude-api` skill 可載入 | ❌ 同左 | ❌ | ❌ |
兩個限制的來源:
- **`Stop` hook 只有 Claude Code 環境實際執行**Codex 會載入 plugin 的 `hooks/hooks.json`,因此 hook command 會先檢查 `CLAUDE_PLUGIN_ROOT`,非 Claude Code 環境直接 no-op。`worklog.sh` 解析的是 **Claude Code 專屬的 transcript JSONL 結構**`type` / `message.content` blocks),所以即使其他助理提供等效 hook 機制,自動記錄也不能直接沿用
- **OpenCode 以「複製 `skills/` 目錄」安裝**不會帶入 `scripts/`,本 skill 的所有模式都無法執行 —— 在 OpenCode 環境請不要觸發本 skill
- 其他助理若要用 `--append``--show` 等純 wiki 操作,只需 `python3`(不需 `claude` CLI),但 `--tune` 必須改為手動設定 `WORKLOG_MODEL`
- **`Stop` hook 只有相容 hook 環境實際執行**Claude Code 會用 `CLAUDE_PLUGIN_ROOT` 定位腳本,Codex 會從 `~/.codex/plugins/cache/doc/jsc` 找已安裝的 worklog 腳本。`transcript.py` 目前支援 Claude Code transcript JSONL`type` / `message.content` blocks與 Codex session JSONL`payload` events / response items,其他助理提供等效 hook,必須先補對應 transcript 解析器
- **OpenCode 以「複製 `skills/` 目錄」安裝**不會帶入 `scripts/`,本 skill 的所有模式都無法執行;若以完整 plugin 目錄執行並能解析 `scripts/worklog`,可用 `WORKLOG_CLI=opencode` 作為摘要 CLI
- 其他助理若要用 `--append``--show` 等純 wiki 操作,只需 `python3`;摘要路徑需要 README 定義的任一 headless CLI。`--tune` 仍是 Claude Code 專屬,其他 CLI 使用各自預設模型或手動設定其 CLI 行為
### 腳本路徑解析(重要)
@@ -61,7 +62,7 @@ WORKLOG_DIR="<skill base directory>/../../scripts/worklog"
本 skill 特有補充:
- **工作內容不落地**transcript 片段以 pipe 傳遞、wiki 走 API 不 clone,全程不產生暫存檔。唯一允許落地的是**模型快取檔** `~/.claude/worklog/model`(僅含模型 id 與判定時間,不含任何工作內容)。
- **工作內容不落地**transcript 片段只在程序記憶體與 stdin/stdout 間傳遞、wiki 走 API 不 clone,全程不產生暫存檔。唯一允許落地的是**模型快取檔** `~/.claude/worklog/model`(僅含模型 id 與判定時間,不含任何工作內容)。
- **絕不阻斷**:hook 路徑任何失敗都以 exit 0 結束,只在 stderr 留訊息。
---
@@ -74,6 +75,7 @@ WORKLOG_DIR="<skill base directory>/../../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_SCOPE` | | 冒號分隔的路徑前綴,僅這些路徑下的 session 才記 | 全部 session 都記 |
| `WORKLOG_ERRLOG` | | 錯誤訊息額外寫入的檔案路徑(只記錯誤、不含工作內容) | 只走 stderr |
@@ -114,12 +116,12 @@ GITEA_TOKEN →(對目標 host 驗證失敗時)→ tea 設定檔中該 host
| 檢查項 | 判準 |
| --- | --- |
| `python3``claude` CLI | `command -v` 是否找得到 |
| `python3`摘要 CLI | `python3``WORKLOG_CLI` 指定或 auto 選到的 CLI 是否找得到 |
| `WORKLOG_*` 變數 | 必要三項是否齊全、`WORKLOG_SCOPE` 是否把當前路徑排除 |
| `scripts/worklog` 目錄 | `${WORKLOG_DIR}` 是否解析成功且三支腳本存在(不存在=此助理不支援) |
| token | `python3 "${WORKLOG_DIR}/wiki_api.py" probe` 的 token 來源與驗證結果 |
| wiki API | Gitea 版本、`repos/<repo>` 與當週頁狀態 |
| 模型快取 | 是否存在是否過期、目前會用哪支模型 |
| 摘要設定 | `WORKLOG_CLI`、選到的 CLI、Claude 模型快取是否存在是否過期 |
| hook 註冊 | `hooks/hooks.json` 是否存在且 plugin 已啟用 |
### `--append "<內容>"`
@@ -169,5 +171,5 @@ GITEA_TOKEN →(對目標 host 驗證失敗時)→ tea 設定檔中該 host
| 助理 | 呼叫 |
| --- | --- |
| Claude Code / Antigravity | `/jsc:worklog --init``/jsc:worklog --tune``/jsc:worklog --diagnose``/jsc:worklog --append "修正 X 的 Y 問題"``/jsc:worklog --show` |
| Codex | `$worklog --diagnose`,或用 `/skills` 選單 |
| OpenCode | **不支援**skills 目錄安裝不含 `scripts/` |
| Codex | `$worklog --diagnose`,或用 `/skills` 選單;可設 `WORKLOG_CLI=codex` |
| OpenCode / GitHub Copilot | 需完整 plugin 目錄保留 `scripts/`;可設 `WORKLOG_CLI=opencode``WORKLOG_CLI=copilot` |