jiantw83 b0dcdaab24 feat(wp-gate): 新增 claim 與 owns,把工作包歸屬寫進閘門
What:`tools/wp-gate.sh` 新增 `claim {owner}/{repo} {wp-number} [--analyze {分析頁頁名}]` 登錄領取、`owns {owner}/{repo} {index} [--wp {wp-number}]` 比對某支 PR 是不是自己這一包的;`lock` 新增 `--wp` 把 PR 掛到工作包名下;`check` 判定已合併時一併交回領取紀錄。新增狀態 `claimed`、`owned`、`foreign`、`unowned`,`foreign` 回 `1`,`owned` 與 `unowned` 回 `0`。

Why:同一份分析常有好幾包平行進行,每包各自的 worktree 與 PR。動任何一支 PR 之前要先確認它是自己這一包的,靠的必須是狀態檔而不是記憶——記憶跨不了工作階段。

How:歸屬一律以分析頁的工作包代號為準,不看分支名、不看 worktree 目錄名,那兩個都可能被改,改了也沒有徵兆。`WP-03`、`WP-3`、`3` 比對前先正規化成 `WP-03`,不然同一包的兩種寫法會被當成兩包。狀態檔的寫入一律轉呼叫 `jsc-hooks` 的 `sdlc-gate.sh`,本檔只讀不寫:兩邊各拼各的檔案,格式一改就對不上。查無歸屬(沒有領取紀錄、工作包還沒掛上 PR)一律 `unowned` 並放行只提醒,這與「查不到就擋」不衝突——那條講的是查得到卻查失敗,這條講的是根本還沒有歸屬可查。擋人時要講得出對方是誰,所以 `foreign` 會指出那支 PR 掛在哪一包名下。合併後交回領取紀錄前先確認領取檔登記的正是這一包,中途改領別包時直接交回會把還在進行的那一包的歸屬清掉。

Who:`jsc-sdlc:implement` 領包、開 PR 與處理留言的每一步,以及跨工作階段接手同一份分析的人。
2026-08-27 11:20:29 +08:00
2026-08-21 04:43:16 +00:00
2026-08-21 14:29:47 +08:00

jsc-sdlc — 開發生命週期

jsc 技能組的 sdlc domain:規劃 → 分析 → 實作 → 維護四個階段,全程以 wiki 頁追蹤(PLAN_CONTENTS、PLAN_{HASH}、ANALYZE_CONTENTS、ANALYZE_{HASH}、REPO_CONTENTS、REPO_{HASH}、DELIVER_CONTENTS、DELIVER_{HASH}、MAINTAIN_CONTENTS)。工作包完成即交付:實作階段會詢問交付文件要產生成 DELIVER_{HASH} wiki 頁或 Gitea 議題留言。hook 或流程失敗記在異常頁(ERROR_CONTENTS、ERROR_{HASH}),那組頁面與範本由 jsc-hooks 擁有,本 domain 不放副本。每次切換階段先過模型閘門,判定全在程式層,由 jsc-hooks/hooks/sdlc-gate.sh lock {stage} 執行;各階段必要標籤、阻擋與回報的鐵則見 references/model-gate.md。分析前先與使用者確認來源分支;實作沿用同一條來源分支作為 worktree 基準與 PR 目標。所有參考與來源分支一律取遠端的 origin/{branch},動作前先 git fetch --prune origin;本地分支不可作為基準,本地與遠端不一致就停下回報。

安裝、更新、移除

Marketplace 統一為 jsc(https://gitea.jsc.idv.tw/plugins/meta.git),安裝 token 為 jsc-sdlc@jsc。每個指令一行:

CLI 安裝 更新 移除
claude claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/meta.git && claude plugin install jsc-sdlc@jsc claude plugin marketplace update jsc && claude plugin update jsc-sdlc@jsc claude plugin uninstall jsc-sdlc@jsc
codex codex plugin marketplace add https://gitea.jsc.idv.tw/plugins/meta.git && codex plugin add jsc-sdlc@jsc codex plugin marketplace upgrade jsc codex plugin remove jsc-sdlc@jsc
copilot copilot plugin marketplace add https://gitea.jsc.idv.tw/plugins/meta.git && copilot plugin install jsc-sdlc@jsc copilot plugin marketplace update jsc && copilot plugin update jsc-sdlc@jsc copilot plugin uninstall jsc-sdlc@jsc
antigravity git clone https://gitea.jsc.idv.tw/plugins/sdlc.git ~/plugins/sdlc && agy plugin install ~/plugins/sdlc git -C ~/plugins/sdlc pull && agy plugin uninstall jsc-sdlc && agy plugin install ~/plugins/sdlc agy plugin uninstall jsc-sdlc
kiro kiro-cli plugin marketplace add https://gitea.jsc.idv.tw/plugins/meta.git && kiro-cli plugin install jsc-sdlc@jsc kiro-cli plugin marketplace update jsc && kiro-cli plugin update jsc-sdlc@jsc kiro-cli plugin uninstall jsc-sdlc@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/wp-gate.sh 工作包 PR 閘門,把「一個工作包的 PR 沒合併,擋的是相依於它的工作包,不是整份分析」從內文敘述變成程式判定,共三個用法。check {owner}/{repo} {index} [--since {ISO 時間}] 查一支 PR:已合併就呼叫 jsc-hooks 的 sdlc-gate.sh wp-unlock 解鎖並印 status=merged;沒合併就印 status=open 或 status=closed-unmerged(被關掉但沒合併不算完成),接著把 issue 留言、審查評語、行內留言全部逐行印出(--since 只印更新的,值取上一輪的 latest=),最後一行印 latest={最新一筆留言的時間戳} 供寫回分析頁。check-deps {owner}/{repo} {wp-number} 查某個候選工作包能不能挑:活抓分析頁 WBS 表的相依欄,逐一核對每個相依工作包的狀態與 PR 是否已合併,只認同一張分析頁上的 WP-NN 編號,指到別份計畫的文字項目查不了就列出來要求人工確認,不當成擋人的理由。lock {owner}/{repo} {index} 在 PR 開好後轉呼叫 sdlc-gate.sh wp-lock 記下未結清(一個工作包一支鎖檔,可以同時記好幾筆平行進行的工作包)。第一行固定 status=... 供程式判讀,其後為繁中說明;結束碼 0=已合併或無阻擋(含 check-deps 的 ready)、1=未合併或 check-deps 判定 blocked、2=用法錯誤、3=相依工具或 PR/分析頁查不到(查不到就擋,不放行)。狀態檔由 jsc-hooks 管($JSC_HOME/wp/{owner}-{repo}-{index}.pr,不綁 session,開新對話照樣擋),本檔只負責查詢與結清
tools/stage-report.sh 階段收尾回報,四個階段共用。stage-report.sh {plan|analyze|implement|maintain} 加 --page TYPE:PAGE(本階段寫過的每一頁,可重複)產出繁中回報:模型閘門判定(轉述 sdlc-gate.sh report,不自評)、工作日誌連結(--worklog、--worklog-heading 組出導向條目標題的錨點)、所有寫入的 wiki 絕對網址。實作階段再加 --worktree、--source-branch、--work-branch、--target-branch、--pr,來源分支在不在遠端、工作分支幾個 commit、推送了沒,都由腳本現查。沒有工作日誌時警告使用者檢查,並用 --pending-file、--log-hash 把內容交給 jsc-log/tools/worklog-pending.sh 暫存,下次寫日誌一併寫入。結束碼 0=完整、1=有警告(警告不是阻擋)、2=用法錯誤、3=相依工具找不到

Skills 目錄

呼叫方式:Claude / Antigravity /jsc-sdlc:{name};Codex ${name};Copilot / Kiro 描述需求自動觸發。

plan

規劃:讀計畫目錄 → 補充或新建計畫 → 決策樹持續提問,補全目標、範圍、可行性到達成共識(判定規則見 references/consensus.md,一輪不算問完)→ 產生使用者故事 → 寫回 PLAN_{HASH} → 階段回報(tools/stage-report.sh)。純邏輯,禁止程式碼與修改檔案。

analyze

分析:先確認來源分支 → 持續提問到達成共識(references/consensus.md)→ 搭配現況(工作目錄與 REPO_{HASH} 盤點複用)分析使用者故事 → WBS 產生編號工作包,WP-01 固定是獨立的交付、交接工作包,實作工作包相依於它 → CPM 估工時與天數 → TDD 拆待辦 → 寫回 ANALYZE_{HASH} → 階段回報(tools/stage-report.sh)。純邏輯,禁止程式碼與修改檔案。

implement

實作:先確認來源分支(同時是 PR 目標)→ 領包前先跑 tools/wp-gate.sh check 把每個已開 PR 但沒合併的工作包留言逐筆印出並修正(以 sub agent 回原 worktree、推同一條工作分支,不開第二個 PR),這一步只結清舊 PR 的留言,不擋別的工作包——修不動或純討論的留言忽略但要在回報裡列出,處理過的時間戳寫回分析頁的 PR 欄位當下一輪的 --since → 產生工作證鎖定「未完成、無工作證」的候選工作包(交付工作包優先),每個候選都跑 tools/wp-gate.sh check-deps 判斷能不能挑:活查它在分析頁上的相依工作包是否都已合併,只有相依於它的包才會被一支未合併的 PR 擋住,跟它無關的工作包可以平行進行 → 交付工作包開工前先確認交付內容(API 文件、由使用者輸入,見 references/deliver-formats.md)→ 動程式碼前先從 origin/{source-branch} 建立 worktree(.worktree/{analysis-HASH}/{wp-number}/{repo},一個工作包一個 worktree,分支處理依決策樹詢問)→ 在 worktree 內逐項 TDD 實作、每完成一項立即更新 wiki → 程式碼審查 → 每完成一個工作包就 commit、push、PR 回來源分支(一包一 PR),接著 tools/wp-gate.sh lock 上鎖,合併後解鎖並移除 worktree → 詢問交付文件格式(DELIVER_{HASH} wiki 頁或 Gitea 議題留言)並產出 → 詢問是否加入維護目錄 → 階段回報(tools/stage-report.sh,多報工作目錄與來源、工作、目標三條分支)。寫程式碼時註解只寫「為什麼這樣寫」,工作包編號、分析頁編號、待辦編號、分支名、PR 編號一律不寫進註解,完整清單與白名單見 jsc-review 的 references/comment-scope.md。

maintain

維護:讀取維護期內的專案,每個專案一個 sub agent:fetch 後切 develop、master 並對齊 origin/{branch} → 提出至少五種維護方法,依決策樹讓使用者挑要做哪些 → commit / push / PR → 更新前次維護時間 → 階段回報(tools/stage-report.sh)。sub agent 改程式碼時註解只寫「為什麼這樣寫」,議題編號、commit hash、分支名、人名與 @ 提及一律不寫進註解,完整清單與白名單見 jsc-review 的 references/comment-scope.md。僅適用於維護期內已交付的專案;尚在實作中或未登記於 MAINTAIN_CONTENTS 的專案不適用。

範本與參考

檔案 用途
templates/plan-page.md、templates/plan-contents.md 計畫頁與計畫目錄
templates/analyze-page.md、templates/analyze-contents.md 分析頁(WBS、CPM、TDD 待辦)與分析目錄
templates/repo-page.md、templates/repo-contents.md 存取庫盤點頁(功能與端點,附 commit sha)與盤點目錄
templates/deliver-page.md、templates/deliver-contents.md 交付頁(API 文件、新舊參數標示、驗證方式)與交付目錄
templates/maintain-contents.md 維護目錄(截止日 NULL = 永久維護)
references/stage-report.md 階段回報:四階段都要交的三項(模型能力標籤、工作日誌連結、所有寫入的 wiki 連結)、實作階段多交的四項、沒寫日誌時的暫存規則、提前停止也要回報
references/model-gate.md 模型閘門:執行順序、各階段必要標籤、阻擋與回報的鐵則
references/tdd.md 接縫、紅綠循環規則、反模式
references/branch.md 分支規則:一律以遠端 origin/{branch} 為準、動作前先 fetch、分析前確認來源分支、實作沿用同一條來源分支作為 PR 目標(一包一 PR,一個工作包的 PR 沒合併只擋相依於它的工作包,不擋整份分析,閘門分工見該檔)、實作一律在 .worktree/{HASH}/{wp-number}/{repo} 內進行——一個工作包一個 worktree,讓互不相依的工作包能平行進行不互相搶路徑(建立前問分支、PR 合併後才移除)、判定遠端預設分支、不破壞未提交變更
references/consensus.md 規劃與分析的提問規則:一輪不算問完、共識的兩個判定條件、未決項處理
references/deliver-formats.md 交付內容型別:API 文件必備欄位、範例資料優先序、既有端點的新舊參數標示

環境變數

Wiki 位置:PLAN_{HASH} / PLAN_CONTENTS 只讀 JSC_WIKI_REPO_PLAN,再退回 JSC_WIKI_REPO;ANALYZE_{HASH} / ANALYZE_CONTENTS 只讀 JSC_WIKI_REPO_ANALYZE,再退回 JSC_WIKI_REPO;REPO_{HASH} / REPO_CONTENTS 只讀 JSC_WIKI_REPO_REPO,再退回 JSC_WIKI_REPO;DELIVER_{HASH} / DELIVER_CONTENTS 只讀 JSC_WIKI_REPO_DELIVER,再退回 JSC_WIKI_REPO;MAINTAIN_CONTENTS 只讀 JSC_WIKI_REPO_MAINTAIN,再退回 JSC_WIKI_REPO。不同類型不可互相代用;兩者都未設定才詢問(見 jsc-gitea)。

HASH 規則:{owner}/{repo} 的共用 wiki hash 一律由 jsc-gitea/tools/hash-id 計算(見 jsc-gitea:wiki),此 domain 不重複實作演算法。

相關 domain

  • jsc-cli:模型能力標籤與階段閘門判定(tools/model-tags.sh、references/model-tags.md、jsc-cli:models)、偏好模型鏈(tools/model-config.sh)
  • jsc-hooks:sdlc-gate 階段模型鎖定
  • jsc-gitea:wiki 讀寫
  • jsc-review:實作完成後的程式碼審查
  • jsc-git / jsc-pkg:維護階段的 commit / PR 與套件更新
  • jsc-log:完工後的工作日誌
S
Description
No description provided
Readme
1.3 MiB
Languages
Shell 100%