From 48b1e39e38a7bad976b2516a7070df552aabf004 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Tue, 22 Sep 2026 15:04:51 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(sdlc-plan):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=AE=B5=E8=90=BD=E8=A6=8F=E5=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 讓 sdlc-plan 產生文件段落,限制規劃階段只保留 analyze 佔位或抽象節點與邊的文字,避免提前產生圖解 artifact。 --- prompts/sdlc-plan.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/prompts/sdlc-plan.md b/prompts/sdlc-plan.md index 43c294b..7385ba2 100644 --- a/prompts/sdlc-plan.md +++ b/prompts/sdlc-plan.md @@ -9,7 +9,7 @@ description: 僅由 /sdlc-plan 指令叫用。把一段口語需求轉成結構 1. 讀齊輸入,列出九個段落中已有依據與缺漏。 2. 一次問一題補齊缺漏;未獲回答的內容放入「未決事項」,不得自行編造。 -3. 套用 `templates/requirement-issue.md`,填入總覽、背景、目標、非目標、領域名詞表、流程圖、驗收標準、影響範圍與未決事項。 +3. 套用 `templates/requirement-issue.md`,填入總覽、背景、目標、非目標、領域名詞表、文件、驗收標準、影響範圍與未決事項;全程使用繁體中文。 4. 用 `scripts/labels-list.js` 取得既有標籤,只能選既有標籤。 5. 寫入前先執行: @@ -19,9 +19,14 @@ node scripts/issue-create.js --repo --title "<標題>" --body-file 確認內容後移除 `--dry-run` 實跑。重跑以標題查重,不建立重複議題。 -## 流程圖限制 +## 文件限制 -流程圖只保留抽象節點與邊的文字描述;本流程不產生 HTML、SVG、manifest、截圖、附件或平台 preview。 +文件段落只填以下其中一種: + +- `待 /sdlc-analyze 產生`。 +- 抽象節點與邊的文字描述,不寫具體圖形語法。 + +plan 階段禁止產生 HTML、SVG、manifest、截圖、附件或任何平台 preview。 ## 邊界 From a9ef078ef6d1717e2f6b93bb1c0b7b9883361df6 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Tue, 22 Sep 2026 15:04:51 +0800 Subject: [PATCH 2/2] =?UTF-8?q?test(sdlc-plan-assets):=20=E8=A3=9C?= =?UTF-8?q?=E4=B8=8A=E6=96=87=E4=BB=B6=E6=AE=B5=E8=90=BD=E8=B3=87=E7=94=A2?= =?UTF-8?q?=E6=B8=AC=E8=A9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 固定 plan prompt 的文件段落、繁體中文、artifact 禁止與同標題查重契約。 --- test/sdlc-plan-assets.test.js | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 test/sdlc-plan-assets.test.js diff --git a/test/sdlc-plan-assets.test.js b/test/sdlc-plan-assets.test.js new file mode 100644 index 0000000..f9b07b3 --- /dev/null +++ b/test/sdlc-plan-assets.test.js @@ -0,0 +1,36 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { + assertNeutralPrompt, + assertTemplateSections, + readPrompt, + readTemplate, +} from './helpers/prompt-doc.js'; + +const prompt = readPrompt('sdlc-plan'); +const template = readTemplate('requirement-issue'); +const SECTIONS = ['總覽', '背景', '目標', '非目標', '領域名詞表', '文件', '驗收標準', '影響範圍', '未決事項']; + +test('plan prompt 使用文件段落並維持繁體中文', () => { + assertNeutralPrompt(prompt, 'sdlc-plan'); + assert.match(prompt, /領域名詞表、文件、驗收標準/); + assert.match(prompt, /全程使用繁體中文/); + assert.doesNotMatch(prompt, /流程圖/); +}); + +test('文件段落只允許 analyze 佔位或抽象節點與邊', () => { + assert.match(prompt, /`待 \/sdlc-analyze 產生`/); + assert.match(prompt, /抽象節點與邊的文字描述/); + assert.match(prompt, /不寫具體圖形語法/); + assert.match(prompt, /禁止產生 HTML、SVG、manifest、截圖、附件或任何平台 preview/); +}); + +test('plan 重跑沿用同標題議題,不建立重複議題', () => { + assert.match(prompt, /重跑以標題查重,不建立重複議題/); +}); + +test('需求議題模板與 plan prompt 使用相同九段落', () => { + assertTemplateSections(template, SECTIONS); + assert.match(template, /\{\{文件\}\}/); + assert.doesNotMatch(template, /^## 流程圖$/m); +});