refactor(code): 接上 shared 共用規範,去除重抄段落並補模型檢查串接

依 todo.md 執行的規範治理專案:action-composite/action-docker/action-node/
image/issues/nuget/review-resolve/sync/target 九個 skill 改為引用
shared 新增的共用 spec(conventional-commit、pull-request、git-push、
git-safety 分支選擇、issue-read、todo-list、ask-user、action-scaffold、
node-src-layout、skill-invocation),移除大量重抄內容(review-resolve/
target 光是 commit/PR/push 三塊就精簡約 175 行);target/issues 補上讀到
帶 model: frontmatter 清單檔時依 /jsc-shared:spec-model 做模型檢查的規則。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 06:04:18 +00:00
co-authored by Claude Sonnet 5
parent 9d8ac26a3b
commit 85a4128f5e
14 changed files with 215 additions and 671 deletions
+14 -33
View File
@@ -18,14 +18,11 @@ argument-hint: "[--target-dir <根目錄>] [--owner <擁有者,以逗號分隔>]
---
## 共用規範(shared plugin,必要前置)
## 共用規範(必要前置)
執行本 skill 前,先以 Skill 工具載入下列共用規範並全程遵守;**任一載入不到(shared plugin 未安裝)時,先詢問使用者是否安裝 shared plugin(`https://gitea.jsc.idv.tw/plugins/shared.git`),使用者不安裝則直接中斷本 skill**,不得只憑下方一行摘要繼續執行:
- `/jsc-shared:spec-output`:繁體中文(台灣用語)、UTF-8(不含 BOM)無亂碼。
- `/jsc-shared:spec-execution`:自動執行原則(必要決策才中斷)、不臆測/需人工確認。
- `/jsc-shared:spec-gitea`:`GITEA_TOKEN` 機密保護(不 echo、遮蔽、clone 後還原乾淨 origin)、API 分頁完整讀取、host 決定順序。
- `/jsc-shared:spec-git-safety`:不破壞既有工作(未提交變更不強切、絕不 `reset --hard`/`clean`)、develop → master 後備、`pull --ff-only`。
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
本 skill 需要的規範:`spec-output`、`spec-execution`、`spec-gitea`、`spec-git-safety`、`spec-ask-user`、`spec-skill-invocation`
本 skill 特有補充:
@@ -71,18 +68,7 @@ argument-hint: "[--target-dir <根目錄>] [--owner <擁有者,以逗號分隔>]
### B1. 分頁取回可讀專案
以 token 呼叫 `GET /api/v1/user/repos`(回傳 token 對應使用者**有權限存取**的 repo:自有、組織成員、協作者),**逐頁抓到取回筆數不足一頁為止**(每頁上限以 API 為準,常見 `limit=50`):
```bash
# 不可印出含 token 的指令;token 以 Header 帶入,輸出時遮蔽
page=1
curl -sS \
-H "Authorization: token ${GITEA_TOKEN}" \
"https://<host>/api/v1/user/repos?page=${page}&limit=50"
```
- 持續累加 `page` 直到某頁回傳筆數 `< limit`(或回空陣列)為止,確保**取得全部**而非只第一頁。
- API 失敗(401/403/網路錯誤)→ 回報錯誤(**遮蔽 token**)並停止;401/403 多半是 token 失效或權限不足。
依 `/jsc-shared:spec-gitea`「API 呼叫慣例」的分頁完整讀取與 401/403 錯誤處理方式,以 token 呼叫 `GET /api/v1/user/repos`(回傳 token 對應使用者**有權限存取**的 repo:自有、組織成員、協作者),持續累加 `page` 直到某頁回傳筆數不足一頁(或回空陣列)為止,確保**取得全部**而非只第一頁。
### B2. 篩選與正規化
@@ -107,11 +93,8 @@ curl -sS \
選擇方式:
- **帶 `--owner` 參數** → 直接採用其中的擁有者,**跳過詢問**;清單中沒有的擁有者回報並略過。
- **未帶 `--owner`** → 這是**不可忽略的必要決策**,必須讓使用者**多選**:
- 擁有者數量 ≤ 4 時,可用助理的多選提問元件(如 Claude Code 的多選問題)。
- 擁有者較多時,請使用者直接以**編號或擁有者名稱**回覆(支援多個,以逗號或空白分隔),並支援回覆 `all`/`全部` 代表全選。
- 解析使用者回覆為擁有者集合;無法對應的輸入請回報並請使用者重選,**不臆測**。
- **帶 `--owner` 參數** → 依 `/jsc-shared:spec-ask-user`「已從其他管道得知答案時要跳過詢問」,直接採用其中的擁有者,**跳過詢問**;清單中沒有的擁有者回報並略過。
- **未帶 `--owner`** → 依 `/jsc-shared:spec-ask-user` 決定呈現方式(擁有者數量 ≤ 4 用 `AskUserQuestion` 多選,超過 4 改文字列出並支援編號/名稱回覆、`all`/`全部` 代表全選),這是**不可忽略的必要決策**;解析使用者回覆為擁有者集合,無法對應的輸入回報並請使用者重選,**不臆測**。
選定後輸出「將同步的擁有者:…」再進入階段 D。
@@ -143,13 +126,11 @@ mkdir -p "<根目錄>/<擁有者>"
### E2. 專案不存在 → clone
- **HTTPS(預設)**:以 token 組 clone URL,**用變數帶入、不可印出**;clone 完成後**還原乾淨 origin**:
- **HTTPS(預設)**:依 `/jsc-shared:spec-gitea`「Token 機密保護」以 token 組 clone URL(用變數帶入、不可印出),clone 完成後還原成不含 token 的乾淨 origin:
```bash
dest="<根目錄>/<擁有者>/<專案名>"
# GITEA_TOKEN 來自環境變數;clone_url 形如 https://<host>/<owner>/<repo>.git
git clone "https://oauth2:${GITEA_TOKEN}@<host>/<owner>/<repo>.git" "${dest}"
# 還原成不含 token 的乾淨 URL,避免 token 落地在 .git/config
git -C "${dest}" remote set-url origin "https://<host>/<owner>/<repo>.git"
```
@@ -209,11 +190,11 @@ git -C "${dest}" fetch --all --prune
## 呼叫方式
格式:`[--target-dir <根目錄>] [--owner <擁有者,以逗號分隔>] [--host <gitea 主機>] [--include-forks] [--ssh] [--yes]` —
依 `/jsc-shared:spec-skill-invocation` 的呼叫方式表格;格式:`[--target-dir <根目錄>] [--owner <擁有者,以逗號分隔>] [--host <gitea 主機>] [--include-forks] [--ssh] [--yes]` —
全部可省略(根目錄預設家目錄;未帶 `--owner` 時於階段 C 詢問多選)。token 一律由環境變數(如 `GITEA_TOKEN`)提供,不寫死、不印出。
| 助理 | 呼叫 |
| --- | --- |
| Claude Code / Antigravity | `/jsc-code:sync`,或 `/jsc-code:sync --owner plugins --target-dir ~/work`、`/jsc-code:sync --include-forks --ssh` |
| Codex | `$sync`,或 `$sync --owner plugins --target-dir ~/work`,或用 `/skills` 選單 |
| OpenCode | 描述需求(如「用 GITEA_TOKEN 取得我有讀取權限的所有 Gitea 專案,依擁有者分組讓我多選,把選定擁有者的專案 clone 到家目錄;已存在的切到 develop/master 更新到最新」)自動觸發 |
範例:
- Claude Code / Antigravity:`/jsc-code:sync`,或 `/jsc-code:sync --owner plugins --target-dir ~/work`、`/jsc-code:sync --include-forks --ssh`
- Codex:`$sync`,或 `$sync --owner plugins --target-dir ~/work`,或用 `/skills` 選單
- OpenCode:描述需求(如「用 GITEA_TOKEN 取得我有讀取權限的所有 Gitea 專案,依擁有者分組讓我多選,把選定擁有者的專案 clone 到家目錄;已存在的切到 develop/master 更新到最新」)自動觸發