From 20cc363c23ebdbfd3623eeac1e2ea00c4fe0be4b Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 24 Aug 2026 17:24:45 +0800 Subject: [PATCH] =?UTF-8?q?feat(git-safety,model):=20=E5=88=86=E6=94=AF?= =?UTF-8?q?=E4=B8=80=E5=BE=8B=E5=85=88=E7=A2=BA=E8=AA=8D=E3=80=81=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=20id=20=E6=94=B9=E4=BB=A5=20transcript=20=E5=AF=A6?= =?UTF-8?q?=E9=9A=9B=E5=80=BC=E7=82=BA=E6=BA=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 (1M context) --- skills/spec-git-safety/SKILL.md | 19 +++++++++++++++++-- skills/spec-model/SKILL.md | 22 +++++++++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/skills/spec-git-safety/SKILL.md b/skills/spec-git-safety/SKILL.md index 4b4554c..bddcf42 100644 --- a/skills/spec-git-safety/SKILL.md +++ b/skills/spec-git-safety/SKILL.md @@ -1,6 +1,6 @@ --- name: spec-git-safety -description: JSC plugins 共用「Git 安全操作規範」:不破壞既有工作(未提交變更先提醒、絕不 reset --hard/checkout -f/clean)、git mv 保留歷史、develop → master 後備分支選擇、pull --ff-only、工作分支選擇(用 git remote show origin/origin/HEAD 判定遠端預設分支、develop 不存在時從遠端預設分支建立、只有來源與目標分支同名才開新分支)、保守解衝突、建立分支不覆蓋(時間戳或短 hash)。當其他 skill 內文引用 spec-git-safety 或 /jsc-shared:spec-git-safety、或執行任何會操作 git 工作區/分支的 JSC skill 時載入此 skill。單獨被使用者呼叫時,直接說明本規範內容。 +description: JSC plugins 共用「Git 安全操作規範」:不破壞既有工作(未提交變更先提醒、絕不 reset --hard/checkout -f/clean)、git mv 保留歷史、develop → master 後備分支選擇、pull --ff-only、分支一律先跟使用者確認(分析前確認來源分支、寫檔前確認目標分支,不從目前 checkout 推定,只讀階段不代為切換)、工作分支選擇(用 git remote show origin/origin/HEAD 判定遠端預設分支、develop 不存在時從遠端預設分支建立、只有來源與目標分支同名才開新分支)、保守解衝突、建立分支不覆蓋(時間戳或短 hash)。當其他 skill 內文引用 spec-git-safety 或 /jsc-shared:spec-git-safety、或執行任何會操作 git 工作區/分支的 JSC skill 時載入此 skill。單獨被使用者呼叫時,直接說明本規範內容。 --- # spec-git-safety — 共用 Git 安全操作規範 @@ -37,7 +37,22 @@ git switch develop 2>/dev/null || git switch -c develop --track origin/develop - 切換後備分支屬不可忽略的狀態變更,需明確告知使用者已從原分支切換到哪個分支。 - 批次更新既有 repo 時用 `git pull --ff-only`;無法快進(本地與遠端分歧)→ 回報需人工處理,**不**自動 merge/rebase/reset。 -## 工作分支選擇 +## 分支一律先跟使用者確認 + +動手之前先確認分支,不可從「目前 checkout 的分支」推定使用者的意圖: + +| 情境 | 要確認的分支 | 確認時機 | +| --- | --- | --- | +| 分析既有程式碼(例:`/jsc-sdlc:analyze`) | **來源分支**——哪條分支的程式碼算現況 | 讀任何程式碼之前 | +| 實作、修改程式碼(例:`/jsc-sdlc:implement`) | **目標分支**——這批工作要合併進哪條分支 | 寫任何檔案之前 | + +確認方式: + +1. 先把事實攤開:目前分支、工作區是否乾淨、遠端有哪些分支(`git branch -r`)、依上一節判定出的遠端預設分支。 +2. 依 `/jsc-shared:spec-ask-user` 的決策樹詢問,每個選項都要標明影響範圍。分析錯分支會產出對不上程式碼的工作包;目標分支錯了則 PR 會開到錯的地方。 +3. 把確認結果寫進該 skill 的產出(分析頁的來源分支欄、PR 的目標分支),後續步驟一律沿用同一個答案,不再自行改判。 +4. **只讀取的階段不切分支**:需要換分支才能讀到正確現況時,停下來請使用者自己切換,不代為 `switch`、不 `stash`、不動工作區。 +5. 使用者沒回答就**不預設** `develop`/`master`;預設值只在使用者明確同意後才成立。 判定遠端預設分支,以及是否需要為當前操作另開一條工作分支: diff --git a/skills/spec-model/SKILL.md b/skills/spec-model/SKILL.md index cc2b83e..356a082 100644 --- a/skills/spec-model/SKILL.md +++ b/skills/spec-model/SKILL.md @@ -40,6 +40,20 @@ description: JSC plugins 共用「取得可用模型並加上標籤」規範: 同一任務有多個候選都滿足必要標籤時,優先挑加分標籤命中較多者;仍並列則挑 `verified_at`(見〔四、快取設計〕)較新者。 +### 與 SDLC 閘門標籤的對應 + +`jsc-cli/references/model-tags.md` 另有一組供程式判定用的英文標籤(機器可讀,`model-tags.sh` 與 `sdlc-gate.sh` 直接比對字面)。兩組標籤的對應如下,**新增或改名任一邊都要同步另一邊**: + +| 本規範標籤 | model-tags.md 標籤 | +| --- | --- | +| `#深度推理`(頂級一階) | `reasoning-max` | +| `#深度推理`(可判讀規格) | `reasoning-high` | +| `#均衡實作` | `coding` | +| `#輕量快速` | `fast`、`cheap` | +| `#長上下文` | `long-context` | + +SDLC 各階段的放行判定一律以 `model-tags.md` 的英文標籤為準;本節的中文標籤用於選型說明與人讀敘述。 + ## 三、取得清單的權威來源優先序 依序取得可用模型清單與其中繼資料(id/定價/上下文長度),**前一項可取得就不往下**: @@ -87,7 +101,13 @@ description: JSC plugins 共用「取得可用模型並加上標籤」規範: 請執行 /model 切換後重新載入,本次不進行任何修改。 ``` -- **限制**:Claude Code **沒有環境變數可讀取當前模型 id**,只能以 agent 對自己當下模型的自我回報為準;自我回報不確定時,請使用者執行 `/status` 確認目前模型後再繼續判斷,不得用猜測代替確認。 +- **取得當前模型 id 的優先序**(前一項可取得就不往下): + + 1. **transcript 記錄的實際值**——hook 收到的 stdin JSON 有 `transcript_path`,該 jsonl 每筆 assistant 訊息都帶 `model` 欄位;取尾端最後一筆即為實際使用的模型。實作見 `jsc-hooks/hooks/lib.sh` 的 `transcript_model`。**這是唯一可驗證的來源**,SDLC 階段閘門(`jsc-hooks/hooks/sdlc-gate.sh`)一律以它為準。 + 2. stdin JSON 的 `model` 欄位、環境變數 `JSC_MODEL`、`~/.claude/settings.json` 的 `model`——都是宣告值,未必等於實際跑的模型。 + 3. **agent 自我回報**——只在以上都取不到時當最後手段。自我回報無法驗證:模型可以宣稱自己具備某標籤而沒有任何東西擋得住,**因此不得作為放行依據**。不確定時請使用者執行 `/status` 確認,不得用猜測代替確認。 + +- **強制力落在程式層**:任何「必須用某能力的模型才能執行」的規則,判定都要由腳本做完並以 exit code 表態;只把要求寫在 skill 內文、交給模型自我檢查,等於沒有閘門。 ## 六、讀到帶 `model:` frontmatter 的清單檔時的檢查義務