一鍵把整個自製 plugin monorepo 發布上 git(stage + commit + push)。當使用者說 /plugin-manager:publish、「發布 plugin」、「推上去 monorepo」、「把自製 plugin 推上 git」時觸發。因為所有納管的 skill 真身在 adopt 時已搬進 monorepo,publish 只做純 git 發布——一次推整個 repo,不管改了幾個 plugin。
Scanned 9/3/2026
Install to Claude Code
npx -y skills add abs1294/fulin-claude-plugins --skill plugin-manager-publish --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Plugin Manager Publish?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/abs1294-plugin-manager-publish)More formats (shields.io, HTML) on the badges page.
---
name: plugin-manager-publish
description: 一鍵把整個自製 plugin monorepo 發布上 git(stage + commit + push)。當使用者說 /plugin-manager:publish、「發布 plugin」、「推上去 monorepo」、「把自製 plugin 推上 git」時觸發。因為所有納管的 skill 真身在 adopt 時已搬進 monorepo,publish 只做純 git 發布——一次推整個 repo,不管改了幾個 plugin。
---
# plugin-manager:publish — 一鍵發布整個 monorepo
把 monorepo(所有自製 plugin 的家)一次 commit + push。解決「一 plugin 一 repo、500 個 plugin 無法維護」的核心痛點——所有自製 plugin 在同一個 repo,發布只需一次。
## 前提
- 自製 skill 的真身在 `/plugin-manager:adopt` 時就已搬進 monorepo,所以 publish **不需要再蒐集**,只做 git。
- monorepo 路徑與 repo 從 `~/.claude/plugin-manager/config.json` 讀。
> **規則 2(改 skill 必發布)**:只要改動任何已納管 skill(monorepo 真身或其 symlink),完成後必須主動提醒使用者 `/plugin-manager:publish` 推上 remote;對「改完沒 publish 就結束對話」也成立——結束前要提醒未發布的 skill 變更。
>
> **規則 4(發布前確認 README)**:若本次 status 含新增/刪除 `plugins/<name>/`,發布前先確認根 `README.md` 的 plugin 列表與「結構」樹已同步,未同步就提醒補上再一起 publish。
>
> 完整規範見 `../../CONVENTIONS.md`。
## 執行步驟
1. **先看待發布狀態**(唯讀,不動 git):
```
node "${CLAUDE_PLUGIN_ROOT}/scripts/publish-status.js"
```
輸出:改動的 plugin、git status、建議 commit message。
2. **若工作區乾淨**:告知沒有待發布改動(若本地領先 origin,提示是否只需 push)。
3. **若有改動**:把 status 與建議 commit message 呈現給使用者,採**無人值守默許模式**:
- 呈現後若使用者**改了 message** → 用改後的;**明確拒絕/喊停** → 中止不 commit、並刪除已排的喚醒(見下)。
- **超過 5 分鐘沒有任何拒絕或修改** → **視為默許,自動採用建議 message 繼續 commit + push**(不再卡等)。
- 呈現時明白告知這條規則(例如「5 分鐘內沒回覆就用這個 message 自動發布」),讓使用者知道可在時限內介入。
- **這是刻意的無人值守設計**(使用者明確要求):5 分鐘默許後會**自動 commit + push**整條跑完——push 是對外動作,但這裡刻意以「沉默即同意」換取無人值守(掛著不顧、回來已發好)。5 分鐘的窗口就是使用者的介入點。
> ⚠️ **「5 分鐘自動推」必須有喚醒源,否則是空頭承諾**(實戰教訓):呈現完 message 後,這一輪就結束、控制權交還使用者——若不主動排一個喚醒,5 分鐘後根本沒有任何東西會觸發 push,只會卡等下一次使用者輸入。
>
> **所以呈現 message 的「同一輪」必須立刻排一個 ~5 分鐘後的喚醒**(與 git-commit 不同:那邊的默許掛在「審查完成事件」、當輪即到,不需計時器;本 skill 是時間驅動,必須自備計時器):
> - 優先 `ScheduleWakeup({ delaySeconds: 300, reason: "publish 默許窗口", prompt: "<重述:到 /plugin-manager:publish 的 commit+push 步驟>" })`;
> - 若環境無 ScheduleWakeup,用 `CronCreate({ recurring:false, durable:false, cron:<現在+5分>, prompt: "[publish 默許自動發布] 若使用者自呈現後未否決/未改 message,直接用建議 message 跑 commit + push + finalize。" })`,並記下 job id。
> - **喚醒時的守衛**:先檢查 ① 使用者是否已在窗口內否決/改 message(是 → 不推、結束)② git 是否已 commit/push(已推 → 結束,不重複);兩者皆否才執行步驟 4。
> - **使用者在 5 分鐘內回應時**:先 `CronDelete <id>`(或讓 ScheduleWakeup 的守衛自然 no-op),再依回應處理,避免喚醒重複觸發。
>
> ⚠️ **cron 只是備援,不是主路徑**(2026-08-26 實戰教訓):cron job **只在 REPL 閒置時才 fire**。
> 若使用者在窗口期間**持續互動**(問別的事、派別的工),REPL 從來不會 idle,cron 永遠不會觸發——
> 而且是**靜默不推**,使用者不問就不會發現(實證:排了 02:17 的 job,一直對話到 03:40 都沒推)。
>
> **正解:每一輪回覆前自己檢查窗口是否已過,過了就直接推,不要等 cron。**
> 具體做法:呈現 message 後的**每一輪**(不論使用者問的是不是 publish 相關),先判定:
> ① 距離呈現是否已過 5 分鐘?② 使用者期間有否否決或改 message?③ git 是否已推?
> ① 是、② 否、③ 否 → **當輪直接跑 commit + push + finalize**,並在回覆中順帶一句告知已發布。
> cron 保留作為「使用者真的離開了」的備援,兩路以 ③ 守衛互斥、不會重複推。
**commit message 必須註明本次改了哪一個/哪些 skill(規則 3 — 版本追蹤)**。格式 `<動作>: <skill 名> — <摘要>`,動作詞 Add/Update/Fix,不得加 AI 署名。範例:`Update: delaylocal skill — 修正 LINE 通知逾時重試`。完整格式與範例詳 `../../CONVENTIONS.md`。
- 因為有默許機制,建議 message 必須**夠完整可直接發布**(照規則 3 寫好),不能只丟半成品等使用者補。
4. **確認後執行 git**(使用者明確確認、或步驟 3 的 5 分鐘喚醒觸發且通過守衛時;在 config.monorepo 目錄,順序:add → commit → push):
先 stage:
```
git -C "<monorepo>" add -A
```
再 commit。**不要**把訊息直接拼進命令列(`-m "<訊息>"`)——若訊息含 `"`、`` ` ``、`$`、`\` 等,會破壞 shell 引號甚至造成命令注入。改用 **stdin 傳遞**,內容原樣不展開。**此段必須在 Bash 執行**(用 Bash tool);heredoc 是 Bash 語法,PowerShell/cmd 不支援:
```bash
git -C "<monorepo>" commit -F - <<'COMMIT_MSG'
<確認後的訊息,可多行,原樣不展開>
COMMIT_MSG
```
最後 push:
```
git -C "<monorepo>" push
```
- 這是獨立的自製 plugin monorepo(非供應商平台四個 repo),可直接在此執行 git。
- commit message 不得加任何 AI 署名(遵守全域規範)。
- **安全**:commit message 來自使用者輸入,務必走 `-F -` / heredoc(在 Bash),**禁止**字串拼接進 `-m`。
5. **發布後清 dirty**(狀態機閉合,**務必執行**):push 成功後跑:
```
node "${CLAUDE_PLUGIN_ROOT}/scripts/publish-finalize.js"
```
- 此腳本只在「工作區乾淨且本地未領先 origin(確實已 push)」時,才把 registry 所有 `dirty=true` 清成 false。
- 若它回報「尚未 push」或「工作區仍有改動」,代表 publish 未完成——先補完再跑。
- **不要**手動編輯 registry 清 dirty;一律用這支腳本,避免漏清或誤清。
## 安全原則(誠實告知)
- push 是對外動作。執行前一定要讓使用者看過 status + commit message(採無人值守默許:呈現後 5 分鐘無拒絕/修改即自動採用,見步驟 3)。
- 不做 force-push / rebase / amend,除非使用者明確要求。
- 若 push 失敗(遠端有新 commit),回報並建議先 pull,不要自動 force。
- publish 只推 monorepo,**不會自動讓已安裝該 plugin 的專案更新**——使用者需各自刷新:`/plugin marketplace update fulin-plugins` 後重裝(`/plugin uninstall` + `/plugin install`),或開 auto-update。**Claude Code 沒有 `/plugin update` 子指令**,且 `/plugin` 系列是互動指令 Claude 不能代執行。
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!