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:
+14
-33
@@ -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 更新到最新」)自動觸發
|
||||
|
||||
Reference in New Issue
Block a user