From 4b482aefc5a2fc6ed54065093d5a0668360e5ccd Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 31 Aug 2026 13:49:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?docs(behaviors):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=9B=9B=E6=94=AF=E6=8A=80=E8=83=BD=E7=9A=84=E8=A1=8C=E7=82=BA?= =?UTF-8?q?=E6=B8=85=E5=96=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What: - 在既有的 `references/` 目錄下新增 `references/behaviors.md`。 - 分成 analyze、implement、maintain、plan 四節,對上 `skills/` 下的四支技能。 - 每節一張五列表:觸發時機、關鍵步驟、外部呼叫、完成條件、可驗證跡象。 Why: - 技能驗證需要一份共同的參考基準。 - 基準留在文件裡,驗證就不必靠人腦記憶技能該有的行為。 - 清單放在技能自己的存取庫,技能改動與清單才會落在同一個 PR。 - 同一個 PR 就不會漂移,也不用跨存取庫開兩條 PR 互卡。 How: - 逐支技能讀 SKILL.md,抽出行為填進五列表。 - 稽核時修正三列:analyze、plan、maintain 的階段鎖狀態檔原本寫成 `$JSC_HOME/wp/`。 - 三列改成實際路徑 `$JSC_HOME/sessions/{工作階段 id}.stage`。 - `$JSC_HOME/wp/` 只留給 implement 的工作包領取檔與 PR 鎖檔。 - 用 `sh /root/plugins/meta/tools/check-behaviors.sh /root/plugins/sdlc` 驗格式,退出碼 0。 Who: - 使用 jsc-sdlc 四支技能的開發者。 - 執行技能驗證的 jsc-meta:skill-check。 - 日後異動這四支技能的維護者,要同步更新這一頁。 --- references/behaviors.md | 43 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 references/behaviors.md diff --git a/references/behaviors.md b/references/behaviors.md new file mode 100644 index 0000000..c8c5ea3 --- /dev/null +++ b/references/behaviors.md @@ -0,0 +1,43 @@ +# jsc-sdlc 技能行為清單 + +本頁記錄 jsc-sdlc 每支技能的行為基準,供技能驗證比對。技能異動時,在同一個 PR 內一起更新這一頁。 + +## analyze + +| 項目 | 內容 | +| --- | --- | +| 觸發時機 | 計畫已經寫進 `PLAN_CONTENTS`、狀態是「未分析」,要把它拆成工作包時用。也用於延伸既有的 `ANALYZE_{HASH}` 分析頁。要寫程式碼時不用,那是 `implement`。`PLAN_CONTENTS` 還沒有計畫時不用,先跑 `plan`。 | +| 關鍵步驟 | 跑 `model-tags.sh sync` 與 `sdlc-gate.sh lock analyze` 過模型閘門,本階段要 `reasoning-max` 標籤、並行讀 `PLAN_CONTENTS` 與 `ANALYZE_CONTENTS`、讓使用者選延伸既有分析或分析新計畫、跑 `git fetch --prune origin` 後確認來源分支,並核對 HEAD 與 `origin/{source-branch}` 指到同一個 commit,有落差就停下回報、逐則使用者故事問到共識、先查 `REPO_{HASH}` 盤點頁決定複用,資料過期就開 sub agent 重新盤點並回寫 `REPO_{HASH}` 與 `REPO_CONTENTS`、做 WBS 拆工作包並標相依,交付工作包固定編為 `WP-01` 且獨立不併入實作包、用 CPM 估工時與天數,標出要徑並依 `references/cpm-chart.md` 畫 mermaid 甘特圖、寫使用者故事驗收計畫,再逐包寫 TDD 待辦、一次寫入 `ANALYZE_{HASH}`,並把 `ANALYZE_CONTENTS` 與 `PLAN_CONTENTS` 各自單列 upsert、跑 `tools/stage-report.sh analyze` 收尾回報。 | +| 外部呼叫 | `jsc-cli/tools/model-tags.sh sync`、`jsc-hooks/hooks/sdlc-gate.sh lock`、`jsc-hooks/hooks/write-guard.sh`(claude 的 `PreToolUse` 擋寫入)、`jsc-gitea:wiki` 與 `jsc-gitea/tools/hash-id`、`jsc-ask:ask`、`tools/stage-report.sh`、`git fetch --prune origin`、`git branch -r`、`git rev-list --left-right --count`。 | +| 完成條件 | 模型閘門退出 0 並回報實際模型 id、來源分支經使用者確認且與遠端一致、每則使用者故事達成共識、每個複用決策連理由記進「複用決策」欄、每則故事對應至少一個編號工作包、每包有工時與天數、要徑與甘特圖齊備、每個實作包至少一則測試先行的 `[ ]` 待辦、`ANALYZE_{HASH}` 存進 wiki 且未決項欄有值(沒有就寫「無」)、目錄頁依 `wiki-get` 退出碼 0 與 4 分流寫入、`stage-report.sh` 的輸出原樣貼給使用者。提前停下也要跑收尾回報。 | +| 可驗證跡象 | wiki 上多一頁或更新一頁 `ANALYZE_{HASH}`;`ANALYZE_CONTENTS` 多一列該分析;`PLAN_CONTENTS` 該計畫那列狀態變成「已分析」;重新盤點時另外寫入 `REPO_{HASH}` 與 `REPO_CONTENTS` 一列;`$JSC_HOME/sessions/{工作階段 id}.stage` 是 `sdlc-gate.sh lock` 寫的階段鎖狀態檔;還沒有工作日誌時,`$JSC_HOME/worklog-pending/{HASH}/` 下有暫存的日誌內容檔。工作目錄的檔案一律不動,程式碼沒有任何改動。 | + +## implement + +| 項目 | 內容 | +| --- | --- | +| 觸發時機 | 分析頁已經有工作包與 TDD 待辦,要動手寫程式碼時用。也用於回頭處理既有工作包 PR 的留言。規劃或分析階段不用。`ANALYZE_CONTENTS` 沒有未完成分析頁時不用。 | +| 關鍵步驟 | 跑 `model-tags.sh sync` 與 `sdlc-gate.sh lock implement` 過模型閘門,本階段要 `coding` 標籤、讀 `ANALYZE_CONTENTS` 與每一頁未完成分析頁,這份資料後續步驟重用不再讀第二次、對每支未合併 PR 並行跑 `wp-gate.sh check` 取狀態與留言、動任何 PR 之前先跑 `wp-gate.sh owns` 確認歸屬,`foreign` 就放手、每則留言先經 `jsc-ask:ask` 取得共識,再由 sub agent 在同一個 worktree 內修、推同一條工作分支、逐則留言用 `gitea.sh comment-reply` 回覆處置結果,把 `latest=` 時間寫回分析頁 PR 欄、一輪留言修正算一個任務,當下寫一筆 `jsc-log:worklog`、列出可挑的工作包,每個候選並行跑 `wp-gate.sh check-deps` 過相依閘門,只有 `ready` 進選項、使用者挑定後跑 `wp-gate.sh claim` 登錄歸屬、確認來源分支,它同時是 worktree 基準與 PR 目標,遠端找不到就停下回報、產生 `TICKET_{yyyyMMdd}_{HHmmss}_{HASH}` 工作證並寫回分析頁「工作證」欄,同時改工作階段名稱、交付包先問交付內容型別並寫回「交付型別」欄、`git fetch --prune origin` 後從 `origin/{source-branch}` 建 worktree,多存取庫並行建、逐項待辦各開一個 sub agent 跑 TDD,主代理每完成一項就把 `[ ]` 翻成 `[x]` 並存回 wiki、收尾並行跑 `jsc-review:code-review` 與 `jsc-review:api-doc`,後者先用 `swagger-detect.sh` 判定,退出碼 1 就明確略過並回報、跑 `jsc-git:pr` 開 PR 回來源分支,把 PR 連結寫回分析頁,再跑 `wp-gate.sh lock` 上鎖、寫一筆工作日誌,接著用 `pr-watch.sh` 輪詢等合併,退出碼 10 就回頭跑同一套留言處理、合併後移除 worktree 並把工作包標為完成、問交付格式並產出 `DELIVER_{HASH}` wiki 頁或 Gitea issue 留言、問要不要登錄維護並 upsert `MAINTAIN_CONTENTS`、跑 `tools/stage-report.sh implement` 收尾回報。 | +| 外部呼叫 | `jsc-cli/tools/model-tags.sh sync`、`jsc-hooks/hooks/sdlc-gate.sh lock`、`tools/wp-gate.sh` 的 `check`、`check-deps`、`claim`、`lock`、`owns`、`tools/stage-report.sh`、`jsc-gitea:wiki`、`jsc-gitea/tools/hash-id`、`jsc-gitea/tools/gitea.sh`(`comment-reply` 與 issue 留言 API)、`jsc-gitea/tools/pr-watch.sh`、`jsc-ask:ask`、`jsc-review:code-review`、`jsc-review:api-doc`、`jsc-review/tools/swagger-detect.sh`、`jsc-hooks/hooks/comment-scope.sh`、`jsc-git:commit`、`jsc-git:pr`、`jsc-log:worklog`、`git fetch`、`git worktree`。 | +| 完成條件 | 模型閘門退出 0、每支未合併 PR 的留言都有處置與回覆、挑中的工作包經 `check-deps` 判為 `ready` 並 `claim` 成功、來源分支經確認並記進分析頁、工作證寫上 wiki、該包每一項待辦在 wiki 上都是 `[x]`、兩個收尾稽核都放行(`api-doc` 回報略過也算放行)、PR 開好且 `wp-gate.sh lock` 回 `status=locked`、工作日誌已寫、`pr-watch.sh` 退出 0 且 `wp-gate.sh check` 回 `status=merged`、交付文件已產出、維護登錄問題已回答、`stage-report.sh` 的輸出原樣貼出並列出 worktree 與三條分支。提前停下也要跑收尾回報。 | +| 可驗證跡象 | 開出一條工作分支,並有一支回到來源分支的 PR;分析頁 `ANALYZE_{HASH}` 的「工作證」欄、「交付型別」欄、PR 欄、待辦勾選狀態都更新過;`DELIVER_{HASH}` wiki 頁或該 issue 下多一則留言;`DELIVER_CONTENTS` 多一列;使用者同意登錄時 `MAINTAIN_CONTENTS` 多一列;`LOG_{HASH}` 每完成一個任務多一筆條目;`$JSC_HOME/wp/{owner}-{repo}.claim` 與 `$JSC_HOME/wp/{owner}-{repo}-{index}.pr` 兩個狀態檔;`{cwd}/.worktree/{分析-HASH}/{工作包編號}/{repo}` 目錄,PR 合併後被移除;該存取庫 `.git/info/exclude` 多一筆 `.worktree/`;PR 每則留言底下有回覆。 | + +## maintain + +| 項目 | 內容 | +| --- | --- | +| 觸發時機 | 已交付、且已登錄在 `MAINTAIN_CONTENTS` 的專案要做定期保養時用。還在實作中的專案不用。沒有登錄進 `MAINTAIN_CONTENTS` 的專案不用。 | +| 關鍵步驟 | 跑 `model-tags.sh sync` 與 `sdlc-gate.sh lock maintain` 過模型閘門,本階段不要求特定標籤,只要判定得出實際模型 id、讀 `MAINTAIN_CONTENTS`,篩出還在維護期內的專案(起始日不晚於今天,結束日為空或不早於今天)、主代理先並行對每個專案跑 `git fetch --prune origin`,切到維護分支並與 `origin/{branch}` 對齊,有落差就回報並略過該專案、之後一個專案一個專案跑,每個專案的維護都開一個 sub agent、每個專案提出至少五項維護做法給使用者挑、把改動用 `jsc-git:commit` 提交到新分支,推送後用 `jsc-git:pr` 開 PR 回步驟 3.1 那條分支、PR 開好當下寫一筆 `jsc-log:worklog`、把該專案在 `MAINTAIN_CONTENTS` 的「前次維護時間」更新成今天、主代理彙整每個專案的做法、PR 表格列與失敗原因、跑 `tools/stage-report.sh maintain` 收尾回報。 | +| 外部呼叫 | `jsc-cli/tools/model-tags.sh sync`、`jsc-hooks/hooks/sdlc-gate.sh lock`、`jsc-gitea:wiki`、`jsc-ask:ask`、`jsc-git:commit`、`jsc-git:pr`、`jsc-log:worklog`、`jsc-pkg:pkg-update`(選了套件更新才用)、`jsc-hooks/hooks/comment-scope.sh`、`tools/stage-report.sh`、`git fetch --prune origin`。 | +| 完成條件 | 模型閘門退出 0、步驟 2 列出的每個在期專案都跑完自己的 sub agent,各自收在一條 PR 連結或一個記錄下來的略過原因、每個完成的專案都有一筆工作日誌,而且下一個專案開始前就存好、`MAINTAIN_CONTENTS` 該專案的「前次維護時間」是今天,其他專案那幾列一個位元組都沒變、彙整報告涵蓋每個專案、`stage-report.sh` 的輸出原樣貼給使用者。沒有專案在期時,一樣要跑收尾回報。 | +| 可驗證跡象 | 每個維護過的專案多一條新分支與一支回到 `develop` 或 `master` 的 PR;`MAINTAIN_CONTENTS` 對應那列的「前次維護時間」變成今天;`LOG_{HASH}` 每個完成的專案多一筆條目;`$JSC_HOME/sessions/{工作階段 id}.stage` 是 `sdlc-gate.sh lock` 寫的階段鎖狀態檔;一個專案都沒完成時,`$JSC_HOME/worklog-pending/{HASH}/` 下有暫存的日誌內容檔。 | + +## plan + +| 項目 | 內容 | +| --- | --- | +| 觸發時機 | 使用者要開新計畫、或要補強既有計畫時用。做分析或寫程式碼時不用。 | +| 關鍵步驟 | 跑 `model-tags.sh sync` 與 `sdlc-gate.sh lock plan` 過模型閘門,本階段要 `reasoning-max` 標籤、讀 `PLAN_CONTENTS`,列出狀態為「未分析」的計畫與各自的 HASH、讓使用者選延伸既有計畫或建立新計畫、依 `references/consensus.md` 跑決策樹,把目標、範圍、可行性三項問到共識,每個答案都要導出下一個問題、把共識寫成「身為⋯⋯我想要⋯⋯以便⋯⋯」格式的使用者故事、套 `templates/plan-page.md` 寫入 `PLAN_{HASH}`、把這份計畫在 `PLAN_CONTENTS` 的那一列 upsert,狀態填「未分析」、跑 `tools/stage-report.sh plan` 收尾回報。 | +| 外部呼叫 | `jsc-cli/tools/model-tags.sh sync`、`jsc-hooks/hooks/sdlc-gate.sh lock`、`jsc-hooks/hooks/write-guard.sh`(claude 的 `PreToolUse` 擋寫入)、`jsc-gitea:wiki` 與 `jsc-gitea/tools/hash-id`、`jsc-ask:ask`、`tools/stage-report.sh`。 | +| 完成條件 | 模型閘門退出 0 並回報實際模型 id、目標、範圍、可行性三項都達成共識,而且使用者明確確認過覆述的摘要、每個共識項目至少對應一則使用者故事、`PLAN_{HASH}` 存進 wiki 且範本要求的每個區段都有值、沒有留下未填的佔位字、`PLAN_CONTENTS` 該列狀態是「未分析」,其他列一個位元組都沒變,而且寫入時分流的 `wiki-get` 退出碼有講出來、`stage-report.sh` 的輸出原樣貼給使用者。提前停下也要跑收尾回報。 | +| 可驗證跡象 | wiki 上多一頁或更新一頁 `PLAN_{HASH}`;`PLAN_CONTENTS` 多一列或更新一列,狀態是「未分析」;`$JSC_HOME/sessions/{工作階段 id}.stage` 是 `sdlc-gate.sh lock` 寫的階段鎖狀態檔;還沒有工作日誌時,`$JSC_HOME/worklog-pending/{HASH}/` 下有暫存的日誌內容檔。工作目錄的檔案一律不動。 | From 7127d7d932aa3c581d1ab081ab990e30d471679b Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 31 Aug 2026 13:49:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?chore(version):=20=E4=B8=89=E4=BB=BD=20mani?= =?UTF-8?q?fest=20=E5=90=8C=E6=AD=A5=E5=8D=87=E7=89=88=E5=88=B0=200.2.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What: - `.claude-plugin/plugin.json` 版本從 0.2.6 改成 0.2.7。 - `.codex-plugin/plugin.json` 版本從 0.2.6 改成 0.2.7。 - `plugin.json` 版本從 0.2.6 改成 0.2.7。 Why: - 本次新增行為清單,屬於外部可見的異動,要升一版。 - 三份 manifest 服務不同的 CLI,版本必須一致。 - 版本一致,版本守衛才判得出這台機器該不該更新。 How: - 只動三份檔案的 `version` 欄位,其他欄位一個位元組都沒改。 - 版號依既有規則進位一個修訂號。 Who: - 安裝或更新 jsc-sdlc 外掛的使用者。 - 比對外掛版本的 jsc-hooks 版本守衛與 jsc-cli:deploy。 --- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- plugin.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 47ab5f4..b03408c 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-sdlc", - "version": "0.2.6", + "version": "0.2.7", "description": "開發生命週期:規劃、分析、實作、維護(wiki 追蹤)", "skills": "./skills", "author": { diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 873415b..6c958c8 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-sdlc", - "version": "0.2.6", + "version": "0.2.7", "description": "開發生命週期:規劃、分析、實作、維護(wiki 追蹤)", "skills": "./skills", "jsc": { diff --git a/plugin.json b/plugin.json index ba0edd9..c44c8fd 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-sdlc", - "version": "0.2.6", + "version": "0.2.7", "description": "開發生命週期:規劃、分析、實作、維護(wiki 追蹤)", "skills": "./skills/", "jsc": {