devlog-tracker 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +234 -0
  3. package/bin/devlog-tracker.js +51 -0
  4. package/cli/init.js +55 -0
  5. package/cli/init.test.js +37 -0
  6. package/cli/merge-hooks.js +60 -0
  7. package/cli/merge-hooks.test.js +187 -0
  8. package/cli/platforms/codex.js +13 -0
  9. package/cli/platforms/cursor.js +13 -0
  10. package/cli/status.js +14 -0
  11. package/cli/status.test.js +33 -0
  12. package/cli/vendor.js +37 -0
  13. package/cli/vendor.test.js +84 -0
  14. package/codex/hooks/on-pre-tool.sh +19 -0
  15. package/codex/hooks/on-session-end.sh +31 -0
  16. package/codex/hooks/on-session-start.sh +37 -0
  17. package/codex/hooks/on-stop.sh +18 -0
  18. package/codex/hooks/on-user-prompt-submit.sh +15 -0
  19. package/codex/hooks/project-dir.sh +13 -0
  20. package/codex/hooks/test-adapters.sh +98 -0
  21. package/codex/hooks.json +54 -0
  22. package/commands/checkpoint.md +17 -0
  23. package/commands/clean.md +50 -0
  24. package/commands/compact.md +24 -0
  25. package/commands/continue.md +30 -0
  26. package/commands/keep.md +100 -0
  27. package/commands/lessons-drift.md +19 -0
  28. package/commands/lessons-off.md +16 -0
  29. package/commands/lessons-on.md +20 -0
  30. package/commands/lessons.md +20 -0
  31. package/commands/overview.md +32 -0
  32. package/commands/pause.md +20 -0
  33. package/commands/resume.md +18 -0
  34. package/commands/segment-watch.md +21 -0
  35. package/commands/span.md +13 -0
  36. package/commands/start.md +19 -0
  37. package/commands/status.md +14 -0
  38. package/cursor/hooks/on-pre-tool.sh +24 -0
  39. package/cursor/hooks/on-session-end.sh +11 -0
  40. package/cursor/hooks/on-session-start.sh +15 -0
  41. package/cursor/hooks/on-stop.sh +44 -0
  42. package/cursor/hooks/on-submit-prompt.sh +28 -0
  43. package/cursor/hooks/on-tool-failure.sh +16 -0
  44. package/cursor/hooks/project-dir.sh +10 -0
  45. package/cursor/hooks/test-adapters.sh +201 -0
  46. package/cursor/hooks.json +26 -0
  47. package/hooks/scripts/await-open.sh +23 -0
  48. package/hooks/scripts/checkpoint-set.sh +44 -0
  49. package/hooks/scripts/clean-devlog.sh +69 -0
  50. package/hooks/scripts/close-open-round.sh +186 -0
  51. package/hooks/scripts/compact-devlog.sh +72 -0
  52. package/hooks/scripts/detect-pending-question.sh +31 -0
  53. package/hooks/scripts/devlog-lock.sh +38 -0
  54. package/hooks/scripts/devlog-md.sh +222 -0
  55. package/hooks/scripts/devlog-path.sh +70 -0
  56. package/hooks/scripts/enforce-devlog.sh +629 -0
  57. package/hooks/scripts/files-snapshot.sh +70 -0
  58. package/hooks/scripts/json-field.sh +76 -0
  59. package/hooks/scripts/keep-move.sh +155 -0
  60. package/hooks/scripts/kept-list.sh +40 -0
  61. package/hooks/scripts/lessons-append.sh +93 -0
  62. package/hooks/scripts/lessons-drift-set.sh +42 -0
  63. package/hooks/scripts/lessons-off.sh +15 -0
  64. package/hooks/scripts/lessons-on.sh +21 -0
  65. package/hooks/scripts/lessons-read.sh +60 -0
  66. package/hooks/scripts/on-session-end.sh +14 -0
  67. package/hooks/scripts/on-stop-failure.sh +18 -0
  68. package/hooks/scripts/on-tool-failure.sh +25 -0
  69. package/hooks/scripts/pause-devlog.sh +13 -0
  70. package/hooks/scripts/redact-prompt.sh +19 -0
  71. package/hooks/scripts/resume-devlog.sh +41 -0
  72. package/hooks/scripts/round-start.sh +333 -0
  73. package/hooks/scripts/run-tests.sh +26 -0
  74. package/hooks/scripts/segment-watch-set.sh +47 -0
  75. package/hooks/scripts/segment-watch.sh +197 -0
  76. package/hooks/scripts/session-start-devlog.sh +157 -0
  77. package/hooks/scripts/span-close.sh +9 -0
  78. package/hooks/scripts/span-open.sh +21 -0
  79. package/hooks/scripts/start-devlog.sh +24 -0
  80. package/hooks/scripts/status-devlog.sh +43 -0
  81. package/hooks/scripts/tests/test-await-open.sh +112 -0
  82. package/hooks/scripts/tests/test-branch-scoped-integration.sh +108 -0
  83. package/hooks/scripts/tests/test-checkpoint-set.sh +36 -0
  84. package/hooks/scripts/tests/test-clean-devlog.sh +160 -0
  85. package/hooks/scripts/tests/test-cli-init-e2e.sh +37 -0
  86. package/hooks/scripts/tests/test-close-open-round.sh +325 -0
  87. package/hooks/scripts/tests/test-compact-devlog.sh +62 -0
  88. package/hooks/scripts/tests/test-devlog-lock.sh +37 -0
  89. package/hooks/scripts/tests/test-devlog-md.sh +530 -0
  90. package/hooks/scripts/tests/test-devlog-path.sh +118 -0
  91. package/hooks/scripts/tests/test-enforce-devlog-files.sh +233 -0
  92. package/hooks/scripts/tests/test-enforce-devlog-handoff-order.sh +223 -0
  93. package/hooks/scripts/tests/test-enforce-devlog-workspace.sh +333 -0
  94. package/hooks/scripts/tests/test-enforce-devlog.sh +1290 -0
  95. package/hooks/scripts/tests/test-files-snapshot.sh +142 -0
  96. package/hooks/scripts/tests/test-json-field.sh +57 -0
  97. package/hooks/scripts/tests/test-keep-move.sh +127 -0
  98. package/hooks/scripts/tests/test-kept-list.sh +80 -0
  99. package/hooks/scripts/tests/test-lessons-append.sh +138 -0
  100. package/hooks/scripts/tests/test-lessons-drift-set.sh +36 -0
  101. package/hooks/scripts/tests/test-lessons-on-off.sh +75 -0
  102. package/hooks/scripts/tests/test-lessons-read.sh +97 -0
  103. package/hooks/scripts/tests/test-on-interrupt.sh +186 -0
  104. package/hooks/scripts/tests/test-redact-prompt.sh +27 -0
  105. package/hooks/scripts/tests/test-resume-devlog.sh +35 -0
  106. package/hooks/scripts/tests/test-round-start.sh +825 -0
  107. package/hooks/scripts/tests/test-segment-watch-set.sh +75 -0
  108. package/hooks/scripts/tests/test-segment-watch.sh +468 -0
  109. package/hooks/scripts/tests/test-session-start-devlog.sh +508 -0
  110. package/hooks/scripts/tests/test-start-pause-devlog.sh +84 -0
  111. package/hooks/scripts/tests/test-status-span.sh +50 -0
  112. package/hooks/scripts/tests/test-workspace-snapshot.sh +130 -0
  113. package/hooks/scripts/workspace-snapshot.sh +69 -0
  114. package/package.json +37 -0
  115. package/skills/devlog-tracker/SKILL.md +411 -0
  116. package/skills/devlog-tracker/references/checkpoint-mode.md +42 -0
  117. package/skills/devlog-tracker/references/lessons-mode.md +32 -0
  118. package/skills/devlog-tracker/references/reply-fold.md +129 -0
  119. package/skills/devlog-tracker/references/round-segments.md +55 -0
  120. package/skills/devlog-tracker/references/span-mode.md +65 -0
@@ -0,0 +1,55 @@
1
+ # Round Segments:單輪內的階段性記錄
2
+
3
+ 一輪如果包含好幾個明顯階段(先探索、再做決策、再實作、再驗證),不要全部
4
+ 憋到最後才寫一次 Summary/Handoff——那樣中途 crash 會整輪的過程全部遺失,事後也
5
+ 看不出中間走過的路。改成邊做邊在這輪底下追加階段性子區塊,插在 User Input 和
6
+ 收尾的 Summary/Handoff 之間:
7
+
8
+ `````markdown
9
+ ## Round 15 — 2026-09-09T09:00:00+08:00
10
+
11
+ ### User Input
12
+ 幫我重構 XXX 模組
13
+
14
+ ### 段落 1 - 09:12
15
+ 讀完現有程式碼,發現三個地方耦合...
16
+
17
+ ### 段落 2 - 09:20
18
+ 決定拆成 A/B 兩個檔案,理由...
19
+
20
+ ### 段落 3 - 09:35
21
+ 完成拆分,跑測試全過
22
+
23
+ ### Summary
24
+ 把 XXX 模組拆成 A/B 兩個檔案,測試全過。
25
+
26
+ ### Handoff
27
+ #### 決策
28
+ 拆成 A/B,理由是三處耦合都集中在同一個檔。
29
+ #### 檔案
30
+ 新增 a.ts、b.ts;刪除 xxx.ts。尚未 commit。
31
+ #### 現況
32
+ 拆分完成,測試全過。
33
+
34
+ ### Status
35
+ DONE
36
+ `````
37
+
38
+ 這個範例是 DONE 且沒有後續,所以沒有 `#### 工作區` 與 `#### 下一步`;這兩節只有 IN_PROGRESS/BLOCKED 才寫。
39
+
40
+ **什麼時候該寫一個段落**:跟判斷 `Status: IN_PROGRESS` 用的同一套標準——「有意義的
41
+ 階段性結果」,不是照時間或工具呼叫次數機械觸發。短的、沒什麼階段可言的一輪,
42
+ 照舊只寫 Summary/Handoff 就好,不用硬湊段落。不要把段落內容再抄進 Summary 或 Handoff。
43
+
44
+ 主路徑仍是判斷何時寫段落,不是照時間機械切段。另外有一道保底:`/devlog-tracker:start`
45
+ 之後,同一輪若連續 10 分鐘(`max_silent_seconds`,預設 600)都沒改
46
+ `.devlog/.round-current.md`(目前開著的這一輪,見 `docs/design/round-current-split.md`),
47
+ 下一個工具會被 PreToolUse hook 擋住。被擋時先 **Read** `.devlog/.round-current.md`,再用
48
+ Edit/StrReplace **追加**一段 `### 段落`(一行也可以);**禁止**用 Write 覆寫整份檔。
49
+ 寫了任何內容計時就歸零。不要用 Bash 繞過。沒呼叫工具就不會響。Claude Code
50
+ dynamic workflow/subagent 的 PreToolUse 若帶非空 `agent_id`,此閥門會跳過(它們
51
+ 與主對話共用 `session_id`,不該被逼寫父輪段落)。門檻用
52
+ `/devlog-tracker:segment-watch <時間長度>`(例如 `/devlog-tracker:segment-watch 5 分鐘`)
53
+ 調整,不用手改 `.devlog/.segment-state` 的 `max_silent_seconds`。
54
+
55
+ 收尾時 Stop hook 仍會要求最後一個 Round 上看得到 `### Summary` 與 `### Handoff`。
@@ -0,0 +1,65 @@
1
+ # Span Mode:橫跨多次自動續接的長任務
2
+
3
+ `/loop` 動態模式、`Workflow`、或任何會讓 Claude 被自己排程(`ScheduleWakeup`、
4
+ 背景 agent 完成通知)反覆喚醒、而不是被使用者手動打字觸發的長任務,如果每次
5
+ 自動喚醒都被當成一輪、強制要求完整寫入 devlog.md,會逼出很多沒有意義的紀錄,
6
+ 或是卡住整個自動化流程。Span Mode 是這種情境下的例外機制。
7
+
8
+ 設計動機、hook 機制細節見 `docs/design/span-mode.md`;這裡只講操作規則。
9
+
10
+ ## 什麼時候該開一個 span
11
+
12
+ 只有在**確定接下來會進入一連串自動續接**時才開(例如剛要開始跑 `/loop` 動態
13
+ 模式、或剛派出一個 `Workflow`),不是每輪隨便判斷。一般的互動式對話不需要,
14
+ 也不應該開 span。
15
+
16
+ ## 怎麼開一個 span
17
+
18
+ 寫完這一輪正常的 Round 區塊(Status 用 `IN_PROGRESS`)之後,使用
19
+ `/devlog-tracker:span`(或跑 `span-open.sh`)建立 `.devlog/.span-open`。
20
+ 除非腳本不可用,否則不要手寫 JSON。檔案格式如下:
21
+
22
+ ```json
23
+ {
24
+ "round": 12,
25
+ "opened_at": "2026-09-08T21:40:00+08:00",
26
+ "ticks_since_checkin": 0,
27
+ "max_silent_ticks": 5
28
+ }
29
+ ```
30
+
31
+ - `round`:剛寫的那個 Round 的編號
32
+ - `opened_at`:現在的 ISO 8601 時間戳
33
+ - `ticks_since_checkin`:固定從 0 開始
34
+ - `max_silent_ticks`:這個 span 容許連續幾次自動 tick 都不寫 devlog.md,自己
35
+ 依任務性質挑一個合理值(沒有標準答案,抓 5 這類量級即可)
36
+
37
+ ## span 開著的時候會自動發生什麼事
38
+
39
+ 不用手動維護——`round-start.sh` 每次自動續接觸發時會自己把 `ticks_since_checkin`
40
+ +1,`enforce-devlog.sh` 只要這個數字還沒到 `max_silent_ticks` 就直接放行,
41
+ devlog.md 完全不用動。一旦累積到門檻,Stop hook 會退回正常模式,**這一輪就
42
+ 會被要求寫東西才能結束**——看到這種擋下來的訊息,代表這個 span 的「安靜額度」
43
+ 用完了,寫點輕量的進度(不用完整 Round,一行都可以)就能讓它繼續運作。
44
+ 前提是最後一個 Round 裡已經有 `### Summary` 與 `### Handoff`——一行是追加到那個 Round,不是新開一個缺標題的 Round。若這輪是新開的 Round,兩個標題都要有。
45
+
46
+ ## 怎麼關掉一個 span
47
+
48
+ 整個 Ask 真的做完時:**開一個新的 Round**(不要回頭改寫當初開 span 那個
49
+ Round),User Input 可以寫「(自動續接收尾,接續 Round 12)」;Summary 用 2–4 句
50
+ 給人看這段自動化的結論;Handoff 依小節總結整段期間做了什麼(決策/檔案/工作區/現況/
51
+ 下一步;`DONE` 省略工作區與下一步);Status 正常寫 `DONE`/`IN_PROGRESS`/`BLOCKED`;然後刪掉 `.devlog/.span-open`。
52
+
53
+ ## 已知限制:分辨不出「這是自動續接還是真人插話」
54
+
55
+ Claude Code 目前沒有任何 hook 欄位能分辨一個 tick 是自動排程觸發的,還是使用
56
+ 者真的手動打了新訊息——這兩種在 span 開著時會被一視同仁地當成一個 tick。如果
57
+ span 開著時你發現進來的其實是一個跟自動任務無關的新請求,應該自己先關掉 span
58
+ (刪除 `.span-open`、補寫收尾的 Round)再處理新請求,不要讓它悄悄被吞進正在
59
+ 開著的 span 裡。
60
+
61
+ ## 崩潰時的風險
62
+
63
+ span 開著時 session 如果崩潰,最壞會漏記最近 `max_silent_ticks` 個 tick 的
64
+ 活動——不是整段 span,風險有明確上限。這是跟「回合進行到一半被砍斷」(見
65
+ SKILL.md「需要誠實說明的邊界」)同一類、但用 tick 數量而不是單一回合為界的風險。