What:`tools/base-branch.sh` 新增 `--derive [分支]` 模式,從分支名推出唯一合法的上一階基底。`feat` 這一類走 `{類型}/{功能}/{子功能}` → `{類型}/{功能}/main` → `develop` → `master`,`fix` 走 `fix/{修改}` → `develop` → `master`。新增退出碼 `7`(推不出唯一合法基底)、`8`(推導出的基底不在遠端又不能自動建立)、`9`(自動建立功能主幹失敗)。既有的呼叫方模式一字未改。
Why:PR 階梯禁止越級,但基底原本靠呼叫端自己挑,挑錯就是把一個子功能直接併進 `develop`,中間那層功能主幹整個被跳過。判斷寫進程式,越級就不會發生在「這次剛好沒注意」的時候。
How:`{子功能}` 可以多層,推導一律把最後一段換成 `main`。推不出唯一合法基底就中止並回 `7`,由呼叫端問使用者,不猜、也不退回 `develop`——退回 `develop` 正是這支腳本要擋的那件事。功能主幹不在 origin 時,直接把 `origin/develop` 推成新分支自動補一條,不動本機工作區,再把建立了哪一條分支印到 stderr。分支名只收 ASCII 小寫、數字、連字號與斜線,中文簡述請先過 `tools/slugify.sh`。
Who:`jsc-git:pr` 決定 PR base 的那一步,以及所有經由它開 PR 的技能。
jsc-git — Commit 與 Push Request
jsc 技能組的 git domain:把檔案變更依同類型與同需求或功能分組認可,並建立符合範本的 Push Request。
安裝、更新、移除
Marketplace 統一為 jsc(https://gitea.jsc.idv.tw/plugins/meta.git),安裝 token 為 jsc-git@jsc。每個指令一行:
| CLI | 安裝 | 更新 | 移除 |
|---|---|---|---|
| claude | claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/meta.git && claude plugin install jsc-git@jsc |
claude plugin marketplace update jsc && claude plugin update jsc-git@jsc |
claude plugin uninstall jsc-git@jsc |
| codex | codex plugin marketplace add https://gitea.jsc.idv.tw/plugins/meta.git && codex plugin add jsc-git@jsc |
codex plugin marketplace upgrade jsc |
codex plugin remove jsc-git@jsc |
| copilot | copilot plugin marketplace add https://gitea.jsc.idv.tw/plugins/meta.git && copilot plugin install jsc-git@jsc |
copilot plugin marketplace update jsc && copilot plugin update jsc-git@jsc |
copilot plugin uninstall jsc-git@jsc |
| antigravity | git clone https://gitea.jsc.idv.tw/plugins/git.git ~/plugins/git && agy plugin install ~/plugins/git |
git -C ~/plugins/git pull && agy plugin uninstall jsc-git && agy plugin install ~/plugins/git |
agy plugin uninstall jsc-git |
| kiro | kiro-cli plugin marketplace add https://gitea.jsc.idv.tw/plugins/meta.git && kiro-cli plugin install jsc-git@jsc |
kiro-cli plugin marketplace update jsc && kiro-cli plugin update jsc-git@jsc |
kiro-cli plugin uninstall jsc-git@jsc |
antigravity 不支援 gitea URL 安裝,改用本地 clone 路徑。批次操作五個 CLI:使用
/jsc-cli:deploy。
舊入口
plugins/jsc已移除,marketplace 正本移到plugins/meta。marketplace 名稱仍是jsc(取自 marketplace.json 的name欄位,與存取庫名無關),安裝 token 不變;已從舊入口安裝過的人先執行claude plugin marketplace remove jsc,再依上表重新 add。
工具
| 檔案 | 用途 |
|---|---|
tools/base-branch.sh |
決定 PR 基底分支:呼叫方傳入的分支最優先,沒傳才依序試 develop、main、master;一律確認分支存在於遠端,找不到就回傳非零。「沒傳」看參數個數,傳入空字串算錯誤,不會退回 develop |
tools/slugify.sh |
把類型與英文短語組成 ASCII 分支名 {type}/{slug};輸入含非 ASCII 或 slug 化後為空,就回傳非零並要求先翻譯成英文短語 |
Skills 目錄
呼叫方式:Claude / Antigravity /jsc-git:{name};Codex ${name};Copilot / Kiro 描述需求自動觸發。
commit
追蹤所有檔案變更,依 Commit 格式 {類型}({需求 or 功能}): {訊息} 將同類型與同需求的變更認可在一起。認可前先跑 jsc-hooks 的 comment-scope.sh sweep 掃過工作區,攔下夾帶文件相關資訊的註解;腳本不在本機就跳過並在回報中說明,不中止認可。訊息格式三選一:完整版(What/Why/How/Who)、簡易版(依 git diff 總結一句)、自訂。
pr
先認可所有變更,再建立目標分支、push、以範本描述建立 Gitea PR。基底分支優先採用呼叫方傳入的分支;呼叫方沒傳,才依序退回 develop、main、master。分支名只允許 ASCII:類型取 commit 優先度最高者,標題先翻譯成英文短語再 slug 化。
範本
| 檔案 | 用途 |
|---|---|
templates/pr-description.md |
PR 描述:摘要、變更內容、設計重點、測試結果、前置 PR |