fix(sdlc-fix): 需求議題本來就沒有未整併留言時照樣列出工作包

原本只寫「未處理數大於 0 就先整併」,零則的入口從沒明寫,讀起來會變成
「沒有留言要處理就到此為止」,正好與「無未整併留言時要列出工作包」相反。
另把交棒的另一端補在 sdlc-feat 的輸入上——機制只有一邊寫得出來,
另一邊就只是散文承諾。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-17 18:21:36 +08:00
co-authored by Claude Opus 5
parent 03ce382220
commit a279591232
4 changed files with 23 additions and 6 deletions
+2 -1
View File
@@ -16,7 +16,8 @@ description: 僅由 /sdlc-feat 指令叫用。領取一顆工作包、備妥工
## 輸入 ## 輸入
一個工作包議題編號。 一個工作包議題編號。使用者直接給的,或 `/sdlc-fix` 收到議題後交棒過來的——
兩者一樣處理,**不要因為是交棒來的就要求他再打一次指令**。
## 第一段:領取與開工準備 ## 第一段:領取與開工準備
+5 -3
View File
@@ -66,12 +66,14 @@ node scripts/wp-extract.js --repo <owner/name> --index <編號>
1. 第 1 步的 `未處理數` 大於 0 就**走 `/sdlc-sync` 的流程**(`prompts/sdlc-sync.md`), 1. 第 1 步的 `未處理數` 大於 0 就**走 `/sdlc-sync` 的流程**(`prompts/sdlc-sync.md`),
做完**自動接回這裡**——重新讀一次留言,拿到的才是剛整併過的狀態。同樣不要求使用者重打指令。 做完**自動接回這裡**——重新讀一次留言,拿到的才是剛整併過的狀態。同樣不要求使用者重打指令。
**`未處理數` 本來就是 0 的話這一步整個跳過**,直接往下選工作包:沒有留言要整併不表示
沒有事要做,使用者是帶著「要改什麼」來的。
2. 整併(與使用者選擇略過)之後還剩下的留言裡,挑出**確實要求改程式碼**的那幾則。判斷 2. 整併(與使用者選擇略過)之後還剩下的留言裡,挑出**確實要求改程式碼**的那幾則。判斷
依據與第 5 步的「必改/建議」同一套:指出了錯誤、遺漏、會出事的寫法,或明確要求改動。 依據與第 5 步的「必改/建議」同一套:指出了錯誤、遺漏、會出事的寫法,或明確要求改動。
3. **一則都沒有就到此為止。** 把整併了幾則、略過幾則講清楚,說明沒有要改碼的意見, 3. **本來有留言,而整併完一則要改碼的都不剩,就到此為止。** 把整併了幾則、略過幾則講清楚,
然後停下來。先 sync 一次通常就清空了,選工作包那一步根本不會觸發。 說明沒有要改碼的意見,然後停下來。先 sync 一次通常就清空了,選工作包那一步根本不會觸發。
確實有要改的,就列出這顆需求底下的工作包,讓使用者挑一顆: 確實有要改的(或一開始就沒有留言要整併),就列出這顆需求底下的工作包,讓使用者挑一顆:
``` ```
node scripts/wp-list.js --repo <owner/name> --requirement <需求議題編號> node scripts/wp-list.js --repo <owner/name> --requirement <需求議題編號>
+8
View File
@@ -14,6 +14,14 @@ const phase1 = prompt.slice(prompt.indexOf('## 第一段'), prompt.indexOf('##
const phase2 = prompt.slice(prompt.indexOf('## 第二段'), prompt.indexOf('## 第三段')); const phase2 = prompt.slice(prompt.indexOf('## 第二段'), prompt.indexOf('## 第三段'));
const phase3 = prompt.slice(prompt.indexOf('## 第三段'), prompt.indexOf('## 邊界')); const phase3 = prompt.slice(prompt.indexOf('## 第三段'), prompt.indexOf('## 邊界'));
test('輸入收得下 /sdlc-fix 交棒過來的編號,且不要求使用者重打指令', () => {
const 輸入 = prompt.slice(prompt.indexOf('## 輸入'), prompt.indexOf('## 第一段'));
assert.match(輸入, /sdlc-fix/);
assert.match(輸入, /交棒/);
assert.match(輸入, /不要因為是交棒來的就要求他再打一次指令/);
});
test('正本平台中立,description 前綴正確', () => { test('正本平台中立,description 前綴正確', () => {
assertNeutralPrompt(prompt, 'sdlc-feat'); assertNeutralPrompt(prompt, 'sdlc-feat');
}); });
+8 -2
View File
@@ -89,11 +89,17 @@ test('需求議題先讓 /sdlc-sync 整併,再談改不改碼', () => {
); );
}); });
test('整併完沒有改碼要求就停下來,不硬找一顆工作包來改', () => { test('本來有留言、整併完沒有改碼要求就停下來,不硬找一顆工作包來改', () => {
assert.match(需求路, /一則都沒有就到此為止/); assert.match(需求路, /本來有留言,而整併完一則要改碼的都不剩,就到此為止/);
assert.match(需求路, /根本不會觸發/); assert.match(需求路, /根本不會觸發/);
}); });
test('本來就沒有未整併留言時照樣列出工作包,不當成沒事可做', () => {
assert.match(需求路, /`未處理數` 本來就是 0/);
assert.match(需求路, /這一步整個跳過/);
assert.match(需求路, /或一開始就沒有留言要整併/, '列清單的入口要同時收得下這一種');
});
test('有改碼要求時列出底下的工作包讓使用者挑,不報錯把事推回去', () => { test('有改碼要求時列出底下的工作包讓使用者挑,不報錯把事推回去', () => {
assert.match(需求路, /wp-list\.js/); assert.match(需求路, /wp-list\.js/);
assert.match(需求路, /--requirement/); assert.match(需求路, /--requirement/);