From e5b247e4cfb47b7e3baec4e756c7890b32d8a31e Mon Sep 17 00:00:00 2001 From: Jeffery Date: Thu, 17 Sep 2026 06:06:09 +0000 Subject: [PATCH] =?UTF-8?q?fix(=E6=8E=92=E7=A8=8B):=20=E6=8B=92=E7=B5=95?= =?UTF-8?q?=E9=87=8D=E8=A4=87=E7=9A=84=E5=B7=A5=E4=BD=9C=E5=8C=85=20index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同一個 index 出現兩次時,相依看的是後者、標題與人天卻取到前者,算出來的時程是 兩份定義混出來的東西,而且回傳 ok:true 完全不報錯。 Co-Authored-By: Claude Opus 5 (1M context) --- scripts/schedule.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/schedule.js b/scripts/schedule.js index aa04c86..5a0f4ba 100644 --- a/scripts/schedule.js +++ b/scripts/schedule.js @@ -66,7 +66,15 @@ function readPlan(planFile) { throw new ScriptError('BAD_PLAN', 'workPackages 需為非空陣列'); } + const seen = new Set(); for (const wp of plan.workPackages) { + // 同一個 index 出現兩次時,相依看的是後者、標題與人天卻取到前者, + // 算出來的時程會是兩份定義混出來的東西,而且完全不會報錯 + if (seen.has(wp.index)) { + throw new ScriptError('BAD_PLAN', `工作包 #${wp.index} 在計畫裡出現了不只一次`); + } + seen.add(wp.index); + if (!Number.isInteger(wp.index) || wp.index <= 0) { throw new ScriptError('BAD_PLAN', `工作包的 index 需為正整數,收到的是 ${wp.index}`); }