13 Commits
Author SHA1 Message Date
jiantw83andClaude Sonnet 5 deddd448a6 feat(log): worklog-target.sh 新增 week 子命令,輸出 yyyy-MM-Wn 工作週編號
因為 worklog 頁面內容是照週五整理的,需要一個能直接算出「這是當月第幾個工作週」
的指令,判斷基準是週五落在哪個月、當月第幾個週五,而不是 ISO 週次或週一所在月份。

新增 `worklog-target.sh week [基準日期 yyyy-MM-dd]`,重用既有 `friday`(週一加四天)
的邏輯算出週五日期,再往前推算當月第幾個週五,組成 `yyyy-MM-Wn` 格式輸出;同時把
`friday`/`week` 兩分支原本各自重複的基準日期格式檢查收進 `friday_of_week()` 內部,
消除重複程式碼,並補齊函式註解的層級標記、步驟條列與範例值,以及 usage() 說明中
原本漏掉的 week 用法。

已用 TDD 驗證跨月週與本週遞增兩種情境、跑過語法檢查與註解掃描,並經兩輪 code
review(六組壞味道)確認無殘留問題。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 11:03:45 +08:00
jiantw83 e762cf986e fix(工作日誌暫存): 收編舊名目錄,並掃出定址不到的孤兒
雜湊規則從 8 碼改成完整 40 碼那一刻,還沒寫進 wiki 的暫存留在舊名底下。
現行程式拿 40 碼去查,查不到那些目錄,裡面的條目就再也寫不出去。

沒人發現是因為兩種狀態長得一樣:「真的沒有待寫」與「待寫卡在舊名底下」
對呼叫端都是成功。技能於是照常回報完成,日誌卻一筆都沒有。

兩道處置。推得出對映的(舊名等於 H 加新名前 7 碼)由 list、cat、merge
一併收編,clear 與 commit 也連舊目錄一起清——commit 不放行的話,已經寫進
wiki 的暫存清不掉,下一輪會整批重複寫一次。推不出對映的交給新的 orphans
子命令掃出來回報,要有人看到才處理得掉。
2026-09-02 15:27:03 +08:00
jiantw83 aee17e45c7 feat(wiki): 三個目錄頁改走專用存取庫,比對鍵改用裸 HASH
What:LOG_CONTENTS、LEARN_CONTENTS、REPORT_CONTENTS 改由 wiki-repo CONTENTS
解析並透過 wiki-contents.sh upsert 寫入,內容頁仍各走自己的型別。LOG 與 REPORT
的目錄頁新增一欄裸 HASH 當比對鍵。

Why:比對鍵原本是含網址的儲存格,換主機、換存取庫或 URL 編碼有差就比對不到,
upsert 會走附加分支,同一頁多出第二列而舊列永遠不再更新。REPORT 更脆:存取庫一換,
雜湊與網址同時變,四個期間的列會一次全部重複。

How:worklog-pending.sh 的 valid_hash 放寬成 40 碼、8 碼與 H 加 7 碼三種形狀。
放寬的是長度不是字元集——先剝字元再比長度的順序保留,路徑穿越與換行注入照樣擋下。
年報不得沿用日誌存取庫那條規則收斂到內容頁,目錄頁同住一庫是另一回事。

Who:jsc-log
2026-09-02 11:02:21 +08:00
jiantw83 04f28d4505 docs(log): 補上工具結束碼宣告與新流程說明
- What:README 的工具表補進彙總腳本,並改寫 worklog 與 report 兩節;
  tools/token-usage.sh 的檔頭改寫成完整的結束碼宣告。
- Why:README 還停在舊流程,讀的人會以為報表數字仍由技能自己數,也不知道週五已經有腳本可用。
  token-usage.sh 原本只寫「護欄回傳 2」,沒說來源讀不到時印 N/A 也算成功,
  接手的人容易把那個情況當成故障,白追一輪。
- How:工具表加一列,寫出彙總腳本的輸出欄位與「無資料不估算」;
  worklog 一節寫出四項來源併行取得、週五由腳本算;
  report 一節寫出三線併行、彙總改走腳本,以及教訓頁另解自己的 wiki 存取庫。
  相依清單補上 jsc-ask 一列,說明它負責問期間與任務狀態。
- Who:整個 log 技能組的說明文件。
2026-08-31 11:07:16 +08:00
jiantw83 1bec87b047 feat(tools): 報表彙總與工作週週五都交給腳本算
- What:新增 tools/log-aggregate.sh,把日誌頁彙總成報表數字;
  tools/worklog-target.sh 新增 friday 子命令,印出該工作週的週五。
- Why:彙總與日期原本只寫在技能散文裡,每次跑都靠模型自己數。
  四個條目只有一個填了花費時間時,模型容易把它攤到每一筆,得出一個沒人做過的工時。
  週五同理,跨月、跨年那一週用手算就會差一天。規則寫進程式,每次跑才會一樣。
- How:log-aggregate.sh 讀日誌條目的固定版型,依條目標題的日期取範圍內的條目,
  印出條目數、存取庫、花費時間、各 CLI 的 token 用量與狀態計數。
  「無資料不估算」寫死在程式裡:沒填時間的條目不進總和,只進 ELAPSED_MISSING;
  整段期間都沒有時間就印「無資料」,不印 0,因為 0 會被讀成「花了 0 分鐘」。
  friday 的週界向 report-range.sh weekly 取得,這裡只做「週一加四天」,不自己定義週的起點。
- Who:report 技能的數字彙總,worklog 技能的日誌頁週次。
2026-08-31 11:07:16 +08:00
jiantw83 7d803245a5 fix(overwrite): 只有頁面真的不存在才建新頁
- What:worklog、learn、report 三支技能共六處讀取分流改寫,只有結束碼 4 才建新頁;
  結束碼 7 與 8 一律中止,一個字都不寫。三份目錄頁樣板補上寫入語意,明寫禁止整頁覆蓋、
  不得改動別人的列。usage-stats.sh 的參數護欄改成明確回傳結束碼 2。
- Why:原本把「讀失敗」與「頁面不存在」當成同一件事。金鑰失效時讀取回 7,技能卻讀成
  「這頁還沒有」,於是照樣板建一份新頁蓋回去。整份工作日誌會被這一筆條目取代,
  既有教訓會被清成空表,報表則產出一份說「這段期間沒有工作」的假數字。
  這些內容只活在 wiki 上,蓋掉就救不回來,所以這是本輪最要緊的一項。
- How:每一處讀取都先看結束碼再決定動作,並在技能文件裡列成表格:
  0 接在既有內容後面附加,4 才從樣板建頁,5 缺網址就中止,7 金鑰或權限問題就中止,
  8 其他 API 失敗就中止。目錄頁一律先讀整頁再改那一列。
  stats 也補上分流,參數錯誤不再被讀成「零次」。
- Who:worklog、learn、report、stats 四支技能的 wiki 讀寫與統計輸出。
2026-08-31 11:07:16 +08:00
jiantw83 416fb916cb feat(worklog-pending): 暫存改三段式的 merge、commit、abort
What:`tools/worklog-pending.sh` 新增 `merge {hash} {本次條目檔}`、`commit {hash} {併入清單}`、`abort {hash} {併入清單}` 三個子命令。`merge` 合成「暫存內容在前、本次條目在後」的檔案並印出 `MERGED=`、`CLAIM=`、`PENDING=`;`commit` 只刪併入清單上那幾個檔;`abort` 暫存一個都不刪,只丟掉合併檔與清單。原本的 `clear` 保留,改為清掉全部暫存。

Why:暫存只能在 wiki 寫入成功之後才清,但原本只有一個 `clear`,呼叫端要嘛先清再寫(寫失敗就兩邊都沒有),要嘛寫完清全部(把 `merge` 之後才存進來的內容一起刪掉)。兩種都會弄丟工作紀錄。

How:`merge` 只讀不刪,刪檔一律等 `commit`,也就是等 wiki 回報成功。只刪清單上的檔案,是為了保住 `merge` 之後、`commit` 之前另一個工作階段新存進來的內容。`commit` 只認 `merge` 產出的清單,而且清單上的路徑必須落在該 hash 的暫存目錄底下,不然當用法錯誤擋下來——這道護欄擋的是拿別處的清單來刪檔。`merge` 在沒有暫存時仍然回 `0`,合併檔至少有本次條目,呼叫端不必分兩條路走。

Who:`jsc-log:worklog` 寫日誌那一步,以及用 `stage-report.sh --pending-file` 暫存過內容的 SDLC 階段。
2026-08-27 11:20:28 +08:00
jiantw83 e6fafd4132 feat(report): 新增工作日誌總結技能
What: 新增 jsc-log:report,把工作日誌總結成年報、月報、週報或日報,寫進 wiki REPORT_{HASH}。另加 tools/report-range.sh 算期間、tools/report-template.sh 解析範本,以及四份報表範本與報表目錄範本。
Why: worklog 只記單筆工作,累積起來沒有工具看得出一週或一個月做了什麼、什麼在卡。要總結只能自己翻頁面加總。
How: 期間換算交給系統的 date,不自己算閏年與週界;週次採 ISO-8601。範本解析採工作目錄優先,.jsc/templates/report-{period}.md 蓋過技能自帶的那份,專案要換格式不必改技能。資料讀 LOG_CONTENTS 列出的所有日誌頁,取工作日期落在期間內的條目,只加總條目真的寫了的數字。
Who: 工作日誌的期間總結。
2026-08-26 10:47:07 +08:00
jiantw83andClaude Opus 5 42ea0a305b feat(log): 工作日誌支援待寫入暫存
What:新增 tools/worklog-pending.sh,worklog 技能改成寫入前先併入暫存內容、寫成功後才清除。

Why:SDLC 階段跑完沒寫工作日誌時,內容如果只留在對話裡,換一個工作階段就補不回來了。

How:暫存放在 $JSC_HOME/worklog-pending/{HASH}/,檔名帶 UTC 時間與 pid,同一秒的兩個工作階段不會互相覆蓋。jsc-sdlc 的階段回報負責存入,worklog 負責併入與清除;清除排在 wiki 寫入成功之後,先清再寫會兩邊都沒有。

Who:用 jsc-sdlc 跑階段、事後要靠工作日誌回頭查的人。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 09:19:43 +08:00
jiantw83andClaude Opus 5 d4bf31421d fix(log): 補齊稽核缺失並修掉護欄失效
What:依 jsc-meta:skill-check 的稽核結果修正技能與工具——補上每個步驟的可檢核完成條件、
把留在內文的標準輸入輸出流程下放 tools/、修正查表與退碼路由造成的誤判。

Why:稽核發現這些缺失會讓技能在實際執行時走錯分支或靜默通過。
完成條件缺漏是最常被違反的一項;退碼誤判與查表錯誤則會讓良性狀況被當成失敗。

How:逐項對照 references/guidelines.md 的審核檢查清單修正,新增的工具都有
documented exit codes,並以真實執行驗證每條路徑。

Who:jsc-meta:skill-check 例行稽核(2026-08-25)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 14:58:54 +08:00
jiantw83 b1a0418211 refactor(worklog): worklog-target.sh 改為接收已算好的 hash
什麼:tools/worklog-target.sh 不再自行重算 SHA-1,改為直接接收呼叫端算好的 hash 參數;skills/worklog/SKILL.md、README.md 同步更新呼叫方式與工具說明;plugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json 版本號由 0.0.3 升至 0.0.4。

為什麼:原本 worklog-target.sh 重複實作了共享的 SHA-1 wiki-hash 演算法,與 jsc-gitea/tools/hash-id 的邏輯重複,違反單一事實來源原則,也和 learn 技能已採用的正確呼叫模式不一致。

如何:移除腳本內建的 sha1sum/shasum 計算與 hash 前綴修正邏輯,改為直接使用傳入的 hash 參數組出 LOG_{HASH}、LOG_CONTENTS;SKILL.md 改為先呼叫 jsc-gitea/tools/hash-id 算出 HASH 再傳給 worklog-target.sh;輸出行為與結果不變。

誰:jsc-meta:skill-check 例行合規稽核(worklog 技能)。
2026-08-24 14:47:26 +08:00
jiantw83 f81da60d02 fix(worklog): 下放 LOG 目標頁計算並統一 hash 2026-08-21 16:53:17 +00:00
jiantw83andClaude Fable 5 de9e342d77 feat(log): 匯入 jsc-log 技能組
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 13:08:43 +08:00