devlog-tracker 0.33.4 → 0.34.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.
- package/README.md +41 -10
- package/README.zh-TW.md +41 -10
- package/cli/agents-md.js +1 -0
- package/cli/agents-md.test.js +10 -0
- package/cli/platforms/claude.js +1 -0
- package/codex/hooks/on-interrupt.sh +13 -0
- package/codex/hooks/on-pre-tool.sh +69 -1
- package/codex/hooks/on-session-end.sh +5 -5
- package/codex/hooks/on-session-start.sh +5 -6
- package/codex/hooks/on-stop.sh +3 -2
- package/codex/hooks/on-subagent-start.sh +19 -0
- package/codex/hooks/project-dir.sh +16 -1
- package/codex/hooks/test-adapters.sh +127 -9
- package/codex/hooks.json +21 -0
- package/commands/continue.md +3 -3
- package/commands/keep-all.md +1 -1
- package/commands/keep.md +2 -2
- package/commands/lessons-on.md +1 -1
- package/commands/migrate.md +18 -0
- package/commands/pr.md +3 -3
- package/commands/resume.md +1 -1
- package/core/scripts/close-open-round.sh +8 -2
- package/core/scripts/devlog-md.sh +6 -11
- package/core/scripts/enforce-devlog.sh +79 -85
- package/core/scripts/handoff-convert.sh +187 -0
- package/core/scripts/handoff-fields.sh +219 -0
- package/core/scripts/handoff-file.sh +19 -88
- package/core/scripts/lessons-subagent-start.sh +1 -1
- package/core/scripts/migrate-handoff.sh +91 -0
- package/core/scripts/round-start.sh +13 -2
- package/core/scripts/segment-watch.sh +1 -1
- package/core/scripts/tests/lib/xml-fixture.sh +10 -0
- package/core/scripts/tests/test-close-open-round.sh +2 -1
- package/core/scripts/tests/test-devlog-md.sh +21 -0
- package/core/scripts/tests/test-enforce-devlog-files.sh +4 -1
- package/core/scripts/tests/test-enforce-devlog-handoff-order.sh +149 -81
- package/core/scripts/tests/test-enforce-devlog-session-handoff.sh +92 -11
- package/core/scripts/tests/test-enforce-devlog-workspace.sh +42 -26
- package/core/scripts/tests/test-enforce-devlog.sh +70 -0
- package/core/scripts/tests/test-handoff-fields.sh +171 -0
- package/core/scripts/tests/test-handoff-file.sh +67 -45
- package/core/scripts/tests/test-migrate-handoff.sh +278 -0
- package/core/scripts/tests/test-round-start.sh +54 -1
- package/core/scripts/tests/test-session-start-devlog.sh +45 -0
- package/core/scripts/tests/test-workspace-snapshot.sh +32 -0
- package/core/scripts/timeline-render.js +26 -2
- package/core/scripts/timeline-render.test.js +23 -1
- package/core/scripts/workspace-snapshot.sh +15 -2
- package/package.json +3 -3
- package/skills/devlog-tracker/SKILL.md +81 -56
- package/skills/devlog-tracker/references/contract.md +4 -3
- package/skills/devlog-tracker/references/lessons-mode.md +7 -7
- package/skills/devlog-tracker/references/round-segments.md +11 -5
|
@@ -12,8 +12,8 @@ description: 在專案的 .devlog/devlog.md 維護逐輪對話紀錄。使用者
|
|
|
12
12
|
|
|
13
13
|
| 維度 | 契約(短) |
|
|
14
14
|
|---|---|
|
|
15
|
-
| **Requirements** | 強制記錄需 `.devlog/.enabled
|
|
16
|
-
| **Output** | 編輯開著的 Round(`.round-current.md`):必有 `### Summary`/`### Reply`/`### Handoff`/`### Status`;Handoff
|
|
15
|
+
| **Requirements** | 強制記錄需 `.devlog/.enabled`(Claude plugin 用 `/devlog-tracker:start`,Codex 用 `$devlog-start`)。`/clear` 後不自動接續;要開工用對應的 continue 指令(或明確說接續)。Cursor/npx 安裝的 Codex 對照 `.devlog-tracker/commands/*.md`;Codex plugin 對照 plugin 根目錄的 `commands/*.md`。 |
|
|
16
|
+
| **Output** | 編輯開著的 Round(`.round-current.md`):必有 `### Summary`/`### Reply`/`### Handoff`/`### Status`;Handoff/Session Handoff 用 XML 標籤,標籤順序固定。格式見「每一輪的紀錄格式」。 |
|
|
17
17
|
| **Invariants** | L1 寫回義務;聊天不旁白記錄動作;不改 User Input(除非 hook `(無 prompt)`);不為同一則訊息再 append `## Round`;設計真相在 `docs/design/*.md`,不是 lessons。 |
|
|
18
18
|
| **Validation** | Soft:收尾前自檢欄位與工作區。Hard:Stop/PreToolUse/workspace/files snapshot(見「每一輪的紀錄格式」末段與 hook 腳本)。fail-open/loop guard 見下方開關一節。 |
|
|
19
19
|
| **Transformation** | 單次動作走對應 `commands/*.md`(start/continue/compact/keep/…);本檔管協定與跨指令不變式,不重抄步驟。 |
|
|
@@ -24,7 +24,7 @@ description: 在專案的 .devlog/devlog.md 維護逐輪對話紀錄。使用者
|
|
|
24
24
|
|
|
25
25
|
devlog.md 是**跨 session 交接連續性**(決策軌跡、目前卡點、下一步、完成條件)的 single source of truth,
|
|
26
26
|
也是 L1「人觸發 continue/開 session 後 agent 可接手」的主入口;接手輪必須把狀態**寫回**本檔。
|
|
27
|
-
不是整個專案的單一真相來源:程式碼/檔案狀態的真相仍是 git
|
|
27
|
+
不是整個專案的單一真相來源:程式碼/檔案狀態的真相仍是 git(工作區(`<workspace>`)是收尾當下的已核對快取:
|
|
28
28
|
`IN_PROGRESS`/`BLOCKED` 時 Stop hook 一律對過 live git,`DONE` 若「檔案」有內容也對過;接手時樹可能已變,`continue`/`resume`
|
|
29
29
|
仍以實際工作樹為準,見 `docs/design/continue.md`);完整逐字過程的真相是對話 transcript(`/clear` 後不存在);設計
|
|
30
30
|
決策的真相是 `docs/design/*.md`。使用者在裡面許願、Claude 也在裡面回報進度與結果——取代「終端機
|
|
@@ -76,7 +76,7 @@ Summary/Handoff」——後面這句要整句刪掉,不是縮短。
|
|
|
76
76
|
- Session Handoff 快照:`.devlog/handoff.md`(`main`/`master`);其他分支 `.devlog/handoff.<branch>.md`。
|
|
77
77
|
由 Stop 在 `IN_PROGRESS`/`BLOCKED` 收尾時覆寫、`DONE` 時刪除;Claude 只寫 Round 內的
|
|
78
78
|
`### Session Handoff`,不要直接編這個檔。設計見 `docs/design/session-handoff-file.md`。
|
|
79
|
-
- Cursor/Codex 上沒有 `/devlog-tracker:*` slash 選單。若專案是用 `npx devlog-tracker init` 裝的,指令對照就是 `.devlog-tracker/commands/*.md`:先 `source .devlog-tracker/env.sh`,再照使用者意圖對應的那份 `.md`
|
|
79
|
+
- Cursor/Codex 上沒有 `/devlog-tracker:*` slash 選單。若專案是用 `npx devlog-tracker init` 裝的,指令對照就是 `.devlog-tracker/commands/*.md`:先 `source .devlog-tracker/env.sh`,再照使用者意圖對應的那份 `.md` 檔案的步驟做。Codex plugin 安裝時,指令對照在 plugin 根目錄的 `commands/*.md`,也可直接用 `$devlog-start` 等 skill。手動裝的專案見 README 安裝章節。
|
|
80
80
|
|
|
81
81
|
第一次使用時,若 `.devlog/` 不存在就建立它。
|
|
82
82
|
|
|
@@ -156,12 +156,12 @@ matcher 設為 `startup|resume|clear|compact|fork`。**開新 session、resume
|
|
|
156
156
|
## 接續:`/devlog-tracker:continue`
|
|
157
157
|
|
|
158
158
|
`/clear` 之後要接著做上一題,下 `/devlog-tracker:continue`(或明確說「continue」
|
|
159
|
-
「接續」「繼續上一題」)。讀 `devlog.md`,**先核對**最後一輪 Handoff
|
|
159
|
+
「接續」「繼續上一題」)。讀 `devlog.md`,**先核對**最後一輪 Handoff 的工作區(`<workspace>`;舊格式 `#### 工作區`)
|
|
160
160
|
(跑步驟 5.1,編成同一格式再對),再依「下一步」開工,並對照「完成條件」。有快照但不符才先寫 `### 段落`;
|
|
161
161
|
沒有快照(舊 Round、`INTERRUPTED` stub)直接以實際狀態為準,不用寫。步驟見 `commands/continue.md`。
|
|
162
162
|
`DONE` 就說明上一題已結束、等新需求,不核對。`BLOCKED`:缺的外部輸入仍缺就停,已經出現就做;
|
|
163
163
|
不要用 git 相不相符當作缺件已到。SessionStart 注入的摘錄若讓你要動手做「下一步」,同樣先核對。
|
|
164
|
-
同一條對話的下一則訊息也一樣:UserPromptSubmit
|
|
164
|
+
同一條對話的下一則訊息也一樣:UserPromptSubmit 若發現上一輪工作區(`<workspace>`)跟 live git 不符,會注入說明並在 PreToolUse 擋住其他工具,直到這一輪寫了含實際快照的 `### 段落`。Span 安靜 tick 與 task-notification 不擋。`DONE` 一律不擋(跟 Stop hook 不同:Stop 在 `DONE` 有「檔案」時會機器核對,但這裡管的是「上一輪的宣稱還能不能拿來接續下一步」——`DONE` 沒有下一步可接,即使當初有檔案也不用重查)。沒呼叫任何工具的純文字回覆不會碰到 PreToolUse,仍應先核對再依實際工作樹行動。擋著的時候,唯讀的 `git status`/`diff`/`log`/`show`/`rev-parse`(不含任何 shell 串接符號)仍可執行,方便自行核對「宣稱 vs 實際」再動手寫段落。
|
|
165
165
|
不要自動觸發。`/devlog-tracker:start` 只對進度,不開工、不核對。
|
|
166
166
|
|
|
167
167
|
### L1 寫回義務
|
|
@@ -186,44 +186,65 @@ hook 已在送出時寫好 User Input;Claude **編輯最後一個 Round**,
|
|
|
186
186
|
<這輪實際對使用者說的話/答應的邊界/未決提問,短述即可。給下一輪知道承諾,不是 Handoff>
|
|
187
187
|
|
|
188
188
|
### Handoff
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
<
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
<下一輪第一件具體要做的事(路徑、指令、要載入的 skill)。
|
|
211
|
-
IN_PROGRESS/BLOCKED 必寫;DONE 且沒有後續就整節省略>
|
|
189
|
+
<handoff>
|
|
190
|
+
<decisions>
|
|
191
|
+
影響後續方向的選擇與理由(沒做選擇就整個標籤省略)
|
|
192
|
+
</decisions>
|
|
193
|
+
<files>
|
|
194
|
+
尚未 commit:
|
|
195
|
+
修改:path/to/file
|
|
196
|
+
</files>
|
|
197
|
+
<workspace>
|
|
198
|
+
main @ a1b2c3d,工作樹乾淨
|
|
199
|
+
</workspace>
|
|
200
|
+
<state>
|
|
201
|
+
任務做到哪、卡在哪
|
|
202
|
+
</state>
|
|
203
|
+
<done-when>
|
|
204
|
+
可觀察的做完判準(IN_PROGRESS/BLOCKED 必寫)
|
|
205
|
+
</done-when>
|
|
206
|
+
<next>
|
|
207
|
+
下一輪第一件具體要做的事(IN_PROGRESS/BLOCKED 必寫)
|
|
208
|
+
</next>
|
|
209
|
+
</handoff>
|
|
212
210
|
|
|
213
211
|
### Session Handoff
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
-
|
|
212
|
+
<session-handoff>
|
|
213
|
+
<decisions>
|
|
214
|
+
- 仍影響後續方向的選擇;沒有就寫 - (無)
|
|
215
|
+
</decisions>
|
|
216
|
+
<open-questions>
|
|
217
|
+
- 下一 session 最該先看的卡點;沒有就寫 - (無)
|
|
218
|
+
</open-questions>
|
|
219
|
+
<failed-attempts>
|
|
220
|
+
- 試過但放棄的做法;沒有就寫 - (無)
|
|
221
|
+
</failed-attempts>
|
|
222
|
+
</session-handoff>
|
|
222
223
|
|
|
223
224
|
### Status
|
|
224
225
|
DONE | IN_PROGRESS | BLOCKED | INTERRUPTED
|
|
225
226
|
```
|
|
226
227
|
|
|
228
|
+
**Handoff/Session Handoff 用 XML 標籤(只有這兩節):** 讀者是下一輪的 agent 與 Stop hook,不是人。規則:
|
|
229
|
+
|
|
230
|
+
- 標籤自己一行(`<next>`、`</next>` 各佔一行),內容寫在中間,照常用 Markdown;不要寫成 `<next>做 X</next>`。
|
|
231
|
+
- 標籤名固定、順序固定;沒發生的欄位整個標籤省略,不要留空標籤。
|
|
232
|
+
- 這不是真的 XML:不用跳脫 `<`、`&`,不要加屬性。
|
|
233
|
+
- 舊的 `#### 小節` 格式只會出現在歷史輪次,讀取時仍相容;這一輪寫舊格式會被 Stop 擋下,照訊息跑 `migrate-handoff.sh` 即可。
|
|
234
|
+
|
|
235
|
+
| 標籤 | 舊格式小節 | 所在區塊 |
|
|
236
|
+
|---|---|---|
|
|
237
|
+
| `<decisions>` | `#### 決策` | Handoff、Session Handoff |
|
|
238
|
+
| `<files>` | `#### 檔案` | Handoff |
|
|
239
|
+
| `<workspace>` | `#### 工作區` | Handoff |
|
|
240
|
+
| `<state>` | `#### 現況` | Handoff |
|
|
241
|
+
| `<done-when>` | `#### 完成條件` | Handoff |
|
|
242
|
+
| `<next>` | `#### 下一步` | Handoff |
|
|
243
|
+
| `<open-questions>` | `#### 待解問題` | Session Handoff |
|
|
244
|
+
| `<failed-attempts>` | `#### 失敗嘗試` | Session Handoff |
|
|
245
|
+
|
|
246
|
+
下文提到「決策」「檔案」「工作區」「現況」「完成條件」「下一步」時,指的就是對應標籤。
|
|
247
|
+
|
|
227
248
|
Round 編號:讀取檔案中最後一個 `## Round <N>`,本輪用 N+1;檔案不存在就從 Round 1 開始。
|
|
228
249
|
|
|
229
250
|
寫入原則:
|
|
@@ -233,19 +254,21 @@ Round 編號:讀取檔案中最後一個 `## Round <N>`,本輪用 N+1;檔
|
|
|
233
254
|
(用詞、並列條件、例外)必須留在檔裡。超長內容由 hook 截斷並標明;不要在收尾時再手動縮成更短的改寫版。
|
|
234
255
|
- **三個讀者拆開:** `Summary` 只給人掃;`Reply` 只記對使用者說過/答應過的話;`Handoff` 只給下一輪
|
|
235
256
|
Claude 接手。同一件事不要三邊複述。
|
|
236
|
-
- **`### Session Handoff`(跨 session 精簡快照):** 與 Checkpoint
|
|
237
|
-
|
|
238
|
-
`
|
|
239
|
-
`
|
|
240
|
-
|
|
241
|
-
|
|
257
|
+
- **`### Session Handoff`(跨 session 精簡快照):** 與 Checkpoint 同款三個標籤(`decisions`/
|
|
258
|
+
`open-questions`/`failed-attempts`),不是 `### Handoff` 六個標籤的複本。`IN_PROGRESS`/`BLOCKED`
|
|
259
|
+
必寫(可 `- (無)`);`DONE` 不要求,但 DONE 輪若寫了仍會被當 XML 驗證(是否存在採 fence-aware 判斷,標題須剛好是
|
|
260
|
+
`### Session Handoff`);`INTERRUPTED` stub 不寫。Stop 通過後會把整個 `<session-handoff>`
|
|
261
|
+
區塊原樣寫進 `.devlog/handoff.md`(分支檔同規則);`DONE` 會刪掉該檔——不要把長期軌跡只寫在
|
|
262
|
+
handoff 檔裡。細節見 `docs/design/session-handoff-file.md`。
|
|
263
|
+
- Handoff 標籤順序固定(`decisions` → `files` → `workspace` → `state` → `done-when` → `next`),Stop hook
|
|
264
|
+
會檢查已出現的標籤順序有沒有錯、有沒有重複(不檢查內容對不對)。沒發生的整個標籤省略,不要寫「無」。
|
|
242
265
|
`現況` 幾乎每輪都該有。`工作區`、`完成條件` 與 `下一步` 在 `IN_PROGRESS`/`BLOCKED` 必寫;`DONE` 且沒有後續就整節省略——
|
|
243
266
|
但 `DONE` 若 `檔案` 有內容(宣稱動過/commit 過檔案),`工作區` 一樣必寫且會被 Stop hook 機器核對,
|
|
244
267
|
避免「已 commit 完成」卻其實沒 commit 這種宣稱跟實際不符沒人發現。
|
|
245
268
|
`完成條件` 要寫到下一輪能對照判斷「可否 DONE」(例如「`bash core/scripts/tests/test-foo.sh` 全過」),
|
|
246
269
|
不要只寫「功能完成」。`下一步` 要具體到下一輪打開就能做(路徑/反引號指令/skill 名),寫「繼續完成」不算完成;
|
|
247
270
|
`IN_PROGRESS` 時 Stop 會做輕量可執行檢查(見下)。`BLOCKED` 的 `現況` 或 `下一步` 必須寫「缺什麼、出現長怎樣」。
|
|
248
|
-
- **`工作區` 是收尾當下的 git 快照,給下一輪核對用。** 寫之前跑 `git status --short`、`git rev-parse --abbrev-ref HEAD`、`git rev-parse --short HEAD`,照輸出寫。`abbrev-ref` 為 `HEAD` 時用 detached 格式;`rev-parse --short HEAD` 失敗但 `git symbolic-ref --short HEAD` 抓得到分支名(尚無 commit,例如剛 `git init`)用 unborn 格式;兩者都失敗才是非 git。髒檔是整棵樹的未提交,不必跟「檔案」那輪 delta
|
|
271
|
+
- **`工作區` 是收尾當下的 git 快照,給下一輪核對用。** 寫之前跑 `git status --short`、`git rev-parse --abbrev-ref HEAD`、`git rev-parse --short HEAD`,照輸出寫。`abbrev-ref` 為 `HEAD` 時用 detached 格式;`rev-parse --short HEAD` 失敗但 `git symbolic-ref --short HEAD` 抓得到分支名(尚無 commit,例如剛 `git init`)用 unborn 格式;兩者都失敗才是非 git。髒檔是整棵樹的未提交,不必跟「檔案」那輪 delta 相同;`.devlog/` 底下的路徑不列(devlog 每輪都會改,只有它髒時照「工作樹乾淨」寫)。格式:
|
|
249
272
|
- 乾淨:`main @ a1b2c3d,工作樹乾淨`(一行)
|
|
250
273
|
- 有未提交:第一行 `feat/foo @ a1b2c3d`,第二行 `未提交:src/a.ts, hooks/foo.sh`
|
|
251
274
|
- 非 git:一行 `非 git 工作區`
|
|
@@ -259,7 +282,7 @@ Round 編號:讀取檔案中最後一個 `## Round <N>`,本輪用 N+1;檔
|
|
|
259
282
|
docs/design/devlog-as-ssot-assessment.md Phase 1);`DONE` 若「檔案」有內容一樣核對——只有
|
|
260
283
|
沒動檔的 `DONE` 與 `INTERRUPTED` 不受影響。
|
|
261
284
|
接手跑 `workspace-snapshot.sh`(`PLUGIN_ROOT` 同其他指令),stdout 就是要對的快照,不要手編(continue/fallback 見 `commands/continue.md` 步驟 5;resume 只做 5.1–5.2,等確認才做下一步)。腳本找不到才退回上面七種格式手編。
|
|
262
|
-
-
|
|
285
|
+
- **`<files>` 是機器可核對的區塊格式(devlog ssot Phase 4)。** 零個以上 `commit <hash>:` 區塊
|
|
263
286
|
(commit 短 hash,依時間序),每個後面接最多三行分類(`新增:`/`修改:`/`刪除:`,逗號分隔路徑,
|
|
264
287
|
沒有就省略那行);最多一個 `尚未 commit:` 區塊,格式相同。一輪可以先 commit 一部分、後面
|
|
265
288
|
繼續改,兩種區塊可以並存。Stop hook 對 `commit` 區塊做逐字精確核對(含分類),對
|
|
@@ -289,7 +312,8 @@ Round 編號:讀取檔案中最後一個 `## Round <N>`,本輪用 N+1;檔
|
|
|
289
312
|
當接續動作**必須**重新載入某個特定 skill 才能正確接手時,才把 skill 名稱寫進 Handoff
|
|
290
313
|
「下一步」裡。
|
|
291
314
|
|
|
292
|
-
|
|
315
|
+
最後一輪的 Handoff/Session Handoff 必須是 XML 標籤格式(舊 `####` 格式會被擋,訊息附 migrate 指令與模板)。
|
|
316
|
+
Stop hook 會檢查最後一個 Round 是否同時有 `### Summary`、`### Reply` 與 `### Handoff`、三者底下有內容、`### Status` 是四個合法值之一,已出現的 Handoff 標籤順序與不重複(`decisions` → `files` → `workspace` → `state` → `done-when` → `next`),以及 `IN_PROGRESS`/`BLOCKED` 時 Handoff 有「完成條件」(`<done-when>`)與「下一步」(`<next>`)且「下一步」不是純黑名單空話(例如整節只寫「繼續完成」,見 `docs/design/next-step-blacklist.md`;這是字串比對,不是語意評分);`IN_PROGRESS` 的「下一步」另做輕量可執行檢查(須含路徑、反引號指令、或檔名/skill 跡象);`BLOCKED` 時「現況」(`<state>`)或「下一步」須含缺件句式(缺/等待/等使用者等);工作區(`<workspace>`)跟 hook 算出的 git 快照相符——`IN_PROGRESS`/`BLOCKED` 一律核對,`DONE` 則只在「檔案」(`<files>`)有內容時才核對(瑣碎、沒動檔的 DONE 輪不受影響);`<files>` 非空時,hook 也會核對它是否符合實際 git 變更(commit 區塊精確核對,未 commit 區塊單向核對,見上方「檔案 machine-verify」);`IN_PROGRESS`/`BLOCKED` 還必須有完整的 `### Session Handoff`(`decisions`/`open-questions`/`failed-attempts`),通過後把 `<session-handoff>` 區塊原樣覆寫到分支對應的 `handoff.md`,`DONE` 則刪除該檔。
|
|
293
317
|
新開的 Round 三個標題(Summary/Reply/Handoff)都要有,瑣碎輪也不例外。
|
|
294
318
|
|
|
295
319
|
### devlog-tracker 自己的管理指令不記錄
|
|
@@ -312,7 +336,7 @@ Stop hook 要求補寫 Summary/Reply/Handoff。這些指令本身就是在
|
|
|
312
336
|
判斷測試:**如果把這一輪從 devlog 刪掉,之後光讀檔案接續工作,會不會漏掉重要資訊?**
|
|
313
337
|
會漏掉就不瑣碎,要完整寫;不會漏掉(純確認、閒聊、使用者只回「好」「謝謝」、沒有產生任何
|
|
314
338
|
實質變化或懸而未決的事)就是瑣碎,但**還是要有這個 Round 區塊**,只是 Summary 一句話、
|
|
315
|
-
Reply 一句(對使用者說過的話)、Handoff
|
|
339
|
+
Reply 一句(對使用者說過的話)、Handoff 只留 `<state>` 一句(沒有 `<workspace>`),Status 多半 `DONE`。三個標題仍然都要有。
|
|
316
340
|
|
|
317
341
|
具體訊號:
|
|
318
342
|
|
|
@@ -337,7 +361,7 @@ Read `.devlog/.round-current.md` 再用 Edit/StrReplace 追加一段(**禁
|
|
|
337
361
|
覆寫整份檔)。
|
|
338
362
|
|
|
339
363
|
完整格式範例、寫入細則、跟 dynamic workflow/subagent 的例外情況,見
|
|
340
|
-
`${CLAUDE_PLUGIN_ROOT}/skills/devlog-tracker/references/round-segments.md`。
|
|
364
|
+
`${DEVLOG_TRACKER_ROOT:-${CLAUDE_PLUGIN_ROOT}}/skills/devlog-tracker/references/round-segments.md`。
|
|
341
365
|
|
|
342
366
|
## Reply Fold:把「Claude 提問、user 回答」記成同一個 Round
|
|
343
367
|
|
|
@@ -358,7 +382,7 @@ Reply Fold 讓它折進同一個 Round。
|
|
|
358
382
|
Status,只有整場問答真正結束才收尾一次。
|
|
359
383
|
|
|
360
384
|
完整步驟、折疊格式、猜錯的處理、跟 task-notification/Span Mode/checkpoint
|
|
361
|
-
計數的關係,見 `${CLAUDE_PLUGIN_ROOT}/skills/devlog-tracker/references/reply-fold.md`。
|
|
385
|
+
計數的關係,見 `${DEVLOG_TRACKER_ROOT:-${CLAUDE_PLUGIN_ROOT}}/skills/devlog-tracker/references/reply-fold.md`。
|
|
362
386
|
|
|
363
387
|
## Span Mode:橫跨多次自動續接的長任務
|
|
364
388
|
|
|
@@ -370,7 +394,7 @@ Status,只有整場問答真正結束才收尾一次。
|
|
|
370
394
|
(`max_silent_ticks`)才強制寫一次;崩潰最多漏記固定數量的 tick,不是整段 span。
|
|
371
395
|
|
|
372
396
|
JSON 格式、開關步驟、已知限制(分辨不出自動續接 vs 真人插話),見
|
|
373
|
-
`${CLAUDE_PLUGIN_ROOT}/skills/devlog-tracker/references/span-mode.md`(設計動機
|
|
397
|
+
`${DEVLOG_TRACKER_ROOT:-${CLAUDE_PLUGIN_ROOT}}/skills/devlog-tracker/references/span-mode.md`(設計動機
|
|
374
398
|
見 `docs/design/span-mode.md`)。
|
|
375
399
|
|
|
376
400
|
## Checkpoint Mode:定期摘要
|
|
@@ -382,7 +406,7 @@ JSON 格式、開關步驟、已知限制(分辨不出自動續接 vs 真人
|
|
|
382
406
|
hook 會要求補一段。
|
|
383
407
|
|
|
384
408
|
運作機制、`/devlog-tracker:pause` 之後的行為,見
|
|
385
|
-
`${CLAUDE_PLUGIN_ROOT}/skills/devlog-tracker/references/checkpoint-mode.md`
|
|
409
|
+
`${DEVLOG_TRACKER_ROOT:-${CLAUDE_PLUGIN_ROOT}}/skills/devlog-tracker/references/checkpoint-mode.md`
|
|
386
410
|
(設計動機見 `docs/design/checkpoint-mode.md`)。補寫時用固定三段:
|
|
387
411
|
`### 決策`/`### 待解問題`/`### 失敗嘗試`(格式與填寫規則見該 reference)。
|
|
388
412
|
|
|
@@ -457,13 +481,14 @@ Handoff。核對用 `commands/continue.md` 步驟 5.1–5.2(不要跟著做 5.
|
|
|
457
481
|
若這輪任務是透過 Agent 工具派 sub agent,或用 Workflow 工具跑多階段 pipeline,一樣可能
|
|
458
482
|
踩到值得記的坑,只是沒有 Round/Status 可比對訊號;讀完 sub agent/workflow 的最終回報後
|
|
459
483
|
自我判斷(例如 verify 推翻了它先前的 fix、它自陳繞了一圈、多個 agent 重複卡在同一種問題、
|
|
460
|
-
或成果被打回票要求重做),值得的話一樣呼叫 `lessons-append.sh`。Claude Code
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
484
|
+
或成果被打回票要求重做),值得的話一樣呼叫 `lessons-append.sh`。Claude Code 與 Codex 的
|
|
485
|
+
`SubagentStart` hook 會在 sub agent 開始時注入 `lessons-append.sh` 的絕對路徑用法,讓它自行判斷
|
|
486
|
+
是否記錄。Claude Code 的前景 agent 回來或背景任務通知到達時,還會顯示 `[Lessons Mode 提示]`
|
|
487
|
+
(`failed`/`killed` 另算進共用計數器);Codex 讀完回報後自行檢查上述訊號。sub agent 已記過
|
|
488
|
+
的不用重複記。
|
|
464
489
|
|
|
465
490
|
寫法、per-topic 存檔規則、索引重建、機制性訊號細節,見
|
|
466
|
-
`${CLAUDE_PLUGIN_ROOT}/skills/devlog-tracker/references/lessons-mode.md`(完整
|
|
491
|
+
`${DEVLOG_TRACKER_ROOT:-${CLAUDE_PLUGIN_ROOT}}/skills/devlog-tracker/references/lessons-mode.md`(完整
|
|
467
492
|
設計見 `docs/design/lessons-mode.md`)。
|
|
468
493
|
|
|
469
494
|
## 無條件清空:`/devlog-tracker:clean`
|
|
@@ -19,9 +19,10 @@
|
|
|
19
19
|
| 產出 | 權威位置 |
|
|
20
20
|
|---|---|
|
|
21
21
|
| Round 骨架:User Input + Summary + Reply + Handoff + Status | `SKILL.md`「每一輪的紀錄格式」 |
|
|
22
|
-
| Handoff
|
|
23
|
-
|
|
|
24
|
-
| `####
|
|
22
|
+
| Handoff/Session Handoff 用 XML 標籤(`<decisions>`/`<files>`/…;舊格式 `#### 決策`/`#### 檔案`/…) | `SKILL.md`「每一輪的紀錄格式」;`core/scripts/handoff-fields.sh`;`docs/design/handoff-xml.md` |
|
|
23
|
+
| Handoff 標籤順序與可省略規則 | 同上(寫入原則) |
|
|
24
|
+
| 工作區(`<workspace>`;舊格式 `#### 工作區`)七種格式 | 同上;生產者 `core/scripts/workspace-snapshot.sh` |
|
|
25
|
+
| 檔案(`<files>`;舊格式 `#### 檔案`)machine-verify 區塊 | 同上;`docs/design/files-verify.md`;`core/scripts/files-snapshot.sh` |
|
|
25
26
|
| Checkpoint 三段 | `references/checkpoint-mode.md` |
|
|
26
27
|
| Session Handoff 三段(揮發快照) | `docs/design/session-handoff-file.md`;`SKILL.md` 格式節 |
|
|
27
28
|
| `### 段落` 格式 | `references/round-segments.md`;Reply Fold 見 `references/reply-fold.md` |
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
下一輪開始時 hook 會**額外**機械印一句提示——這個不經過門檻計數,偵測到就印一次(因為它本身
|
|
19
19
|
就是一次性事件,不是可以累積的次數)。
|
|
20
20
|
|
|
21
|
-
以上四種**完全不 hook
|
|
22
|
-
|
|
21
|
+
以上四種**完全不 hook 強制寫入本身**——寫不寫都不影響這一輪能不能收尾,跟「Handoff 的
|
|
22
|
+
`<decisions>`(舊格式 `#### 決策`)沒有就整個標籤省略」同一種精神,不要自己加壓力覺得每輪都要交一份。
|
|
23
23
|
|
|
24
24
|
**寫法**:跑(`PLUGIN_ROOT` 同其他指令):
|
|
25
25
|
|
|
@@ -30,7 +30,7 @@ DEVLOG_PROJECT_DIR="<專案根目錄絕對路徑,不要用 $(pwd)>" bash "${PL
|
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
同一個主題重複呼叫會累加進同一個 `devlog.lessons.<topic>.md`;不同主題各自成檔。內容不用固定
|
|
33
|
-
子欄位,跟 `####
|
|
33
|
+
子欄位,跟 Handoff 的 `<decisions>`(舊格式 `#### 決策`)一樣是敘事性的,不要硬套模板。腳本會自動重建 `devlog.md` 尾端的
|
|
34
34
|
`## Lessons 索引`(每個主題檔一行:則數、最新一則的標題、更新時間),SessionStart 只注入這個
|
|
35
35
|
索引,不會注入任何 `devlog.lessons.*.md` 的全文。要看全文用 `/devlog-tracker:lessons [<topic>]`
|
|
36
36
|
(沒給 topic 就只印索引)——這是純讀取,不像 `resume` 會核對工作區或等使用者確認才動手。
|
|
@@ -49,14 +49,14 @@ verify 階段推翻了 sub agent 先前的 fix/claim、sub agent 自陳繞了
|
|
|
49
49
|
裡多個 agent 各自卡在類似問題(彙整成一筆更有代表性的)、sub agent 的成果被使用者或
|
|
50
50
|
reviewer 打回票要求重做。
|
|
51
51
|
|
|
52
|
-
Claude Code
|
|
53
|
-
- sub agent/Workflow agent 開始時(`SubagentStart`),hook 會把 `lessons-append.sh` 的用法
|
|
52
|
+
Lessons Mode 開著時,Claude Code 與 Codex 的 `SubagentStart` hook 會在 sub agent 開始時把 `lessons-append.sh` 的用法
|
|
54
53
|
連同**主專案絕對路徑**注入它的 context,它覺得值得就自己記一筆,並在最終回報裡說一聲。
|
|
55
54
|
worktree isolation 下也照那條絕對路徑指令跑,不會寫錯地方。
|
|
56
|
-
|
|
55
|
+
|
|
56
|
+
Claude Code 上,前景 sub agent 回來時(`PostToolUse`),或背景 sub agent/Workflow 的 task-notification
|
|
57
57
|
到達時(`round-start.sh`),你會看到一句 `[Lessons Mode 提示]`,提醒你檢查上面四種訊號;
|
|
58
58
|
背景任務 `status` 是 `failed`/`killed` 時還會算進共用計數器。
|
|
59
59
|
|
|
60
60
|
看到提示後:sub agent 已說明記過的主題不要重複記;多個 agent 卡在同一種問題時,由你彙整成
|
|
61
|
-
一筆更有代表性的。一樣全部非強制。Codex
|
|
61
|
+
一筆更有代表性的。一樣全部非強制。Codex 的完成後提示與 Cursor 的子代理提示仍由你自己判斷。詳見
|
|
62
62
|
`docs/design/lessons-mode.md`「sub agent/workflow 情境的自我判斷訊號」。
|
|
@@ -27,23 +27,29 @@
|
|
|
27
27
|
告訴使用者拆分完成、測試全過,還沒 commit。
|
|
28
28
|
|
|
29
29
|
### Handoff
|
|
30
|
-
|
|
30
|
+
<handoff>
|
|
31
|
+
<decisions>
|
|
31
32
|
拆成 A/B,理由是三處耦合都集中在同一個檔。
|
|
32
|
-
|
|
33
|
+
</decisions>
|
|
34
|
+
<files>
|
|
33
35
|
尚未 commit:
|
|
34
36
|
新增:a.ts, b.ts
|
|
35
37
|
刪除:xxx.ts
|
|
36
|
-
|
|
38
|
+
</files>
|
|
39
|
+
<workspace>
|
|
37
40
|
main @ a1b2c3d
|
|
38
41
|
未提交:xxx.ts, a.ts, b.ts
|
|
39
|
-
|
|
42
|
+
</workspace>
|
|
43
|
+
<state>
|
|
40
44
|
拆分完成,測試全過。
|
|
45
|
+
</state>
|
|
46
|
+
</handoff>
|
|
41
47
|
|
|
42
48
|
### Status
|
|
43
49
|
DONE
|
|
44
50
|
`````
|
|
45
51
|
|
|
46
|
-
這個範例是 DONE 且沒有後續,所以沒有
|
|
52
|
+
這個範例是 DONE 且沒有後續,所以沒有 `<done-when>` 與 `<next>`;「檔案」有內容,所以 `<workspace>` 仍要寫(Stop 會核對)。Handoff/Session Handoff 用 XML 標籤(`<decisions>`/`<files>`/…),格式細節見 `SKILL.md`「每一輪的紀錄格式」。
|
|
47
53
|
|
|
48
54
|
**什麼時候該寫一個段落**:跟判斷 `Status: IN_PROGRESS` 用的同一套標準——「有意義的
|
|
49
55
|
階段性結果」,不是照時間或工具呼叫次數機械觸發。短的、沒什麼階段可言的一輪,
|