From 18a22ce640bfeda76da3c9867ac30ddbcb8fe8ec Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 21 Aug 2026 13:08:18 +0800 Subject: [PATCH 1/9] =?UTF-8?q?chore(hooks):=20=E4=BF=AE=E6=AD=A3=E7=AF=84?= =?UTF-8?q?=E6=9C=AC=20manifest=20=E8=88=87=E7=A7=BB=E9=99=A4=20hello=20?= =?UTF-8?q?=E7=AF=84=E4=BE=8B=E7=AC=A6=E5=90=88=20hooks=20=E9=A0=98?= =?UTF-8?q?=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .agents/plugins/marketplace.json | 6 ++--- .claude-plugin/marketplace.json | 8 +++---- .claude-plugin/plugin.json | 18 ++++++++++----- .codex-plugin/plugin.json | 6 ++--- plugin.json | 8 +++---- skills/hello/SKILL.md | 38 -------------------------------- 6 files changed, 26 insertions(+), 58 deletions(-) delete mode 100644 skills/hello/SKILL.md diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 2c2dafc..57968a1 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -1,11 +1,11 @@ { - "name": "template", + "name": "hooks", "plugins": [ { - "name": "jsc-template", + "name": "jsc-hooks", "source": { "source": "url", - "url": "https://gitea.jsc.idv.tw/plugins/template.git" + "url": "https://gitea.jsc.idv.tw/plugins/hooks.git" } } ] diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index e3d2436..3bd3dee 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -1,14 +1,14 @@ { - "name": "template", - "description": "JSC 跨 AI 助理共用 skills 的 Claude Code marketplace。", + "name": "hooks", + "description": "jsc 技能組 hooks domain 的 marketplace。", "owner": { "name": "JSC" }, "plugins": [ { - "name": "jsc-template", + "name": "jsc-hooks", "source": "./", - "description": "JSC 共用 skills(跨 AI 助理)" + "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄" } ] } diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index a5c2dd3..bd1ad1a 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,12 +1,18 @@ { - "name": "jsc-template", - "version": "0.0.3", - "description": "JSC 跨 AI 助理共用 plugin 模板(Claude Code / Codex / Antigravity / OpenCode)。所有 skills 以 SKILL.md 為共通標準,於 Claude Code 以 /jsc-template: 前綴呼叫。", + "name": "jsc-hooks", + "version": "0.2.0", + "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄", "skills": "./skills", "author": { "name": "JSC" }, - "homepage": "https://gitea.jsc.idv.tw/plugins/template", - "repository": "https://gitea.jsc.idv.tw/plugins/template.git", - "keywords": ["template", "skills", "cross-tool", "jsc"] + "homepage": "https://gitea.jsc.idv.tw/plugins/hooks", + "repository": "https://gitea.jsc.idv.tw/plugins/hooks.git", + "keywords": [ + "jsc", + "hooks", + "skills", + "cross-tool" + ], + "hooks": "./hooks/hooks.json" } diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 71a3c32..6c42010 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { - "name": "jsc-template", - "version": "0.0.3", - "description": "JSC 跨 AI 助理共用 plugin 模板。所有 skills 以 SKILL.md 為共通標準。", + "name": "jsc-hooks", + "version": "0.2.0", + "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄", "skills": "./skills" } diff --git a/plugin.json b/plugin.json index 4873395..909495b 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { - "name": "jsc-template", - "version": "0.0.3", - "description": "JSC 跨 AI 助理共用 plugin 模板。所有 skills 以 SKILL.md 為共通標準;於 Antigravity 以 /jsc-template: 前綴呼叫。", + "name": "jsc-hooks", + "version": "0.2.0", + "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄", "skills": "./skills/" -} \ No newline at end of file +} diff --git a/skills/hello/SKILL.md b/skills/hello/SKILL.md deleted file mode 100644 index c5be22f..0000000 --- a/skills/hello/SKILL.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: hello -description: 範例 skill,用來驗證 jsc plugin 是否安裝成功,也是新增 skill 的範本。當使用者輸入 hello、想測試 plugin、或想看 skill 模板長什麼樣子時觸發;回覆一句問候並簡述此 plugin 的用途。 ---- - -# hello(範例 skill) - -這是 `jsc-template` plugin 的範例 skill。它有兩個用途: - -1. **驗證安裝** — 跨各家 AI 助理確認 skill 已被正確載入。 -2. **作為範本** — 複製這個資料夾即可新增一個新的 skill。 - -## 呼叫方式 - -| 助理 | 呼叫方式 | -| --- | --- | -| Claude Code | `/jsc-template:hello` | -| Antigravity | `/jsc-template:hello`,或描述需求自動觸發 | -| Codex | 在提示詞輸入 `$hello`,或用 `/skills` 選單 | -| OpenCode | 直接描述需求,模型會透過 skill 工具自動呼叫 | -| GitHub Copilot CLI | 直接描述需求,Copilot 會讀取已安裝 plugin 的 skills | - -## 行為 - -當這個 skill 被觸發時: - -1. 回覆「Hello from **jsc** 👋」。 -2. 用一句話說明 `jsc-template` 是一個跨 AI 助理的共用 skill 集合。 -3. 提示使用者可以在 README 的「Skills 目錄」查看所有可用的 skills。 - -## 如何以此為範本新增 skill - -1. 複製 `skills/hello/` 為 `skills//`。 -2. 修改 `SKILL.md` 的 frontmatter: - - `name`:小寫、數字、連字號(`-`),最長 64 字元。**這個名稱會成為 Claude Code / Antigravity 的 `/jsc-template:` 指令**。 - - `description`:第三人稱,寫清楚「什麼時候該用、什麼時候不該用」與觸發關鍵字 — 各家助理靠這段文字決定是否自動載入。 -3. 在內文寫下 skill 的具體步驟。 -4. 手動把新 skill 補進 README 的「Skills 目錄」區塊。 -- 2.53.0 From b774df23ae674553a82ad4952521d6320679fdb2 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 21 Aug 2026 13:08:43 +0800 Subject: [PATCH 2/9] =?UTF-8?q?feat(hooks):=20=E5=8C=AF=E5=85=A5=20jsc-hoo?= =?UTF-8?q?ks=20=E6=8A=80=E8=83=BD=E7=B5=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- hooks/hooks.json | 19 +++++++++++++++++++ hooks/lib.sh | 35 +++++++++++++++++++++++++++++++++++ hooks/session-timer.sh | 22 ++++++++++++++++++++++ hooks/skill-usage.sh | 22 ++++++++++++++++++++++ hooks/ste100-guard.sh | 6 ++++++ skills/hooks-install/SKILL.md | 30 ++++++++++++++++++++++++++++++ 6 files changed, 134 insertions(+) create mode 100644 hooks/hooks.json create mode 100755 hooks/lib.sh create mode 100755 hooks/session-timer.sh create mode 100755 hooks/skill-usage.sh create mode 100755 hooks/ste100-guard.sh create mode 100644 skills/hooks-install/SKILL.md diff --git a/hooks/hooks.json b/hooks/hooks.json new file mode 100644 index 0000000..729bf36 --- /dev/null +++ b/hooks/hooks.json @@ -0,0 +1,19 @@ +{ + "hooks": { + "SessionStart": [ + { "hooks": [ { "type": "command", "command": "sh \"${CLAUDE_PLUGIN_ROOT}/hooks/session-timer.sh\" start" } ] } + ], + "UserPromptSubmit": [ + { "hooks": [ { "type": "command", "command": "sh \"${CLAUDE_PLUGIN_ROOT}/hooks/ste100-guard.sh\"" } ] } + ], + "Stop": [ + { "hooks": [ { "type": "command", "command": "sh \"${CLAUDE_PLUGIN_ROOT}/hooks/session-timer.sh\" mark" } ] } + ], + "SessionEnd": [ + { "hooks": [ { "type": "command", "command": "sh \"${CLAUDE_PLUGIN_ROOT}/hooks/session-timer.sh\" mark" } ] } + ], + "PostToolUse": [ + { "matcher": "Skill", "hooks": [ { "type": "command", "command": "sh \"${CLAUDE_PLUGIN_ROOT}/hooks/skill-usage.sh\"" } ] } + ] + } +} diff --git a/hooks/lib.sh b/hooks/lib.sh new file mode 100755 index 0000000..baa3468 --- /dev/null +++ b/hooks/lib.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env sh +# lib.sh — jsc hooks 共用函式。所有 hook 腳本 source 此檔。 +# 輸入相容:Claude 式 stdin JSON、或環境變數(codex/copilot/antigravity/kiro 接線時設定)。 +# 缺資料時安靜降級,hook 永遠 exit 0,不可中斷宿主 CLI。 + +JSC_HOME="${JSC_HOME:-$HOME/.jsc}" +mkdir -p "$JSC_HOME/sessions" "$JSC_HOME/usage" 2>/dev/null || true + +# 讀完 stdin(可能為空;非阻塞宿主) +read_stdin() { + if [ -t 0 ]; then STDIN_JSON=""; else STDIN_JSON=$(cat 2>/dev/null || true); fi +} + +# 從 stdin JSON 取字串欄位(naive 但足夠應付各 CLI 的扁平 payload) +json_str() { # $1=欄位名 + printf '%s' "$STDIN_JSON" | tr -d '\n' \ + | sed -n "s/.*\"$1\"[[:space:]]*:[[:space:]]*\"\([^\"]*\)\".*/\1/p" | head -n1 +} + +# 目前 session id:stdin JSON > 環境變數 > 固定值 +session_id() { + sid=$(json_str session_id) + [ -n "$sid" ] || sid="${JSC_SESSION_ID:-${CLAUDE_SESSION_ID:-default}}" + printf '%s' "$sid" +} + +# 目前 CLI 名稱:環境變數 > 依 stdin 特徵猜測 > unknown +cli_name() { + if [ -n "${JSC_CLI:-}" ]; then printf '%s' "$JSC_CLI" + elif [ -n "${CLAUDE_PLUGIN_ROOT:-}" ]; then printf 'claude' + else printf 'unknown'; fi +} + +now_epoch() { date +%s; } +now_iso() { date -u +%Y-%m-%dT%H:%M:%SZ; } diff --git a/hooks/session-timer.sh b/hooks/session-timer.sh new file mode 100755 index 0000000..dc9368f --- /dev/null +++ b/hooks/session-timer.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env sh +# session-timer.sh — 記錄工作階段花費時間(供 jsc-log:worklog 取用)。 +# 用法: +# session-timer.sh start # SessionStart:記錄起始時間 +# session-timer.sh mark # Stop/SessionEnd:更新最後活動時間 +# session-timer.sh report [sid] # 印出 {sid} {seconds};無紀錄印 0 +HERE=$(dirname "$0"); . "$HERE/lib.sh" +read_stdin +sid=$(session_id) +case "${1:-mark}" in + start) + f="$JSC_HOME/sessions/$sid.start" + [ -f "$f" ] || now_epoch > "$f" ;; + mark) + now_epoch > "$JSC_HOME/sessions/$sid.end" ;; + report) + rsid="${2:-$sid}" + s=$(cat "$JSC_HOME/sessions/$rsid.start" 2>/dev/null || echo "") + e=$(cat "$JSC_HOME/sessions/$rsid.end" 2>/dev/null || now_epoch) + if [ -n "$s" ]; then echo "$rsid $((e - s))"; else echo "$rsid 0"; fi ;; +esac +exit 0 diff --git a/hooks/skill-usage.sh b/hooks/skill-usage.sh new file mode 100755 index 0000000..a669b66 --- /dev/null +++ b/hooks/skill-usage.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env sh +# skill-usage.sh — 記錄技能使用與呼叫鏈(供 jsc-log:stats 統計)。 +# Claude: PostToolUse(matcher=Skill) 接線;其他 CLI 由 wrapper 以 +# JSC_SKILL= skill-usage.sh 呼叫。 +# 產出: +# $JSC_HOME/usage/skills.jsonl {ts,cli,session,skill} +# $JSC_HOME/usage/chains.jsonl {ts,cli,session,from,to}(同 session 內前一技能 → 本技能) +HERE=$(dirname "$0"); . "$HERE/lib.sh" +read_stdin +skill="${JSC_SKILL:-$(json_str skill)}" +[ -n "$skill" ] || exit 0 +sid=$(session_id); cli=$(cli_name); ts=$(now_iso) +printf '{"ts":"%s","cli":"%s","session":"%s","skill":"%s"}\n' \ + "$ts" "$cli" "$sid" "$skill" >> "$JSC_HOME/usage/skills.jsonl" +last_f="$JSC_HOME/sessions/$sid.lastskill" +last=$(cat "$last_f" 2>/dev/null || echo "") +if [ -n "$last" ]; then + printf '{"ts":"%s","cli":"%s","session":"%s","from":"%s","to":"%s"}\n' \ + "$ts" "$cli" "$sid" "$last" "$skill" >> "$JSC_HOME/usage/chains.jsonl" +fi +printf '%s' "$skill" > "$last_f" +exit 0 diff --git a/hooks/ste100-guard.sh b/hooks/ste100-guard.sh new file mode 100755 index 0000000..c9e89e4 --- /dev/null +++ b/hooks/ste100-guard.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh +# ste100-guard.sh — 於每次使用者提示時注入語言規則(hook > prompt 的強制層)。 +# Claude: UserPromptSubmit 的 stdout 會成為額外 context。 +# 其他 CLI: 由 hooks-install 以各自的規則檔(AGENTS.md 等)落地,本腳本仍可被 wrapper 呼叫。 +echo "[jsc] 輸出規則:所有回覆基於 STE100 使用繁體中文(短句、一句一指令、主動語態、術語一致、UTF-8 無亂碼)。" +exit 0 diff --git a/skills/hooks-install/SKILL.md b/skills/hooks-install/SKILL.md new file mode 100644 index 0000000..5583b83 --- /dev/null +++ b/skills/hooks-install/SKILL.md @@ -0,0 +1,30 @@ +--- +name: hooks-install +description: Wire jsc hooks (STE100 guard, session timer, skill usage logger) into every installed AI CLI. Detect CLIs via jsc-cli detect-clis.sh, then apply native hook config per CLI or fall back to instruction files. Use after installing or updating the jsc plugin set; not for writing new hooks. +--- + +# hooks-install — 將 jsc hooks 接線到所有已安裝的 CLI + +目標:讓三支 hook(`ste100-guard.sh`、`session-timer.sh`、`skill-usage.sh`)在每個 CLI 生效。 +細節流程**必須以 sub agent 執行**,主 agent 只回報結果摘要。 + +## 步驟 + +1. 執行 `jsc-cli/tools/detect-clis.sh` 取得已安裝的 CLI 與路徑。 +2. 對每個 CLI 依下表接線(hook 優先,無 hook 系統就降級為規則檔): + +| CLI | 接線方式 | +| --- | --- | +| claude | plugin 安裝時自動載入 `jsc-hooks/hooks/hooks.json`,只需驗證:`claude plugin list` 有 `jsc-hooks` 且 `/hooks` 顯示已註冊 | +| codex | `~/.codex/config.toml` 設定 `notify` 指向 `session-timer.sh mark`(帶 `JSC_CLI=codex`);STE100 規則追加到 `~/.codex/AGENTS.md`(prompt 降級) | +| copilot | 無 hook 系統:STE100 規則追加到 `~/.config/copilot/copilot-instructions.md`(prompt 降級) | +| antigravity | 無公開 hook 系統:STE100 規則追加到全域 rules 檔(prompt 降級) | +| kiro | 於工作區 `.kiro/hooks/` 建立 agent hook,觸發時執行對應腳本(帶 `JSC_CLI=kiro`) | + +3. 規則檔追加內容一律使用 `ste100-guard.sh` 的輸出文字,且以 `` 標記包住,重複執行時整段取代不重複追加。 +4. 回報每個 CLI 的接線結果(成功 / 降級為 prompt / 跳過原因)。 + +## 注意 + +- Hook 腳本同時接受 stdin JSON 與環境變數(`JSC_CLI`、`JSC_SESSION_ID`、`JSC_SKILL`),wrapper 只需設環境變數。 +- 資料落在 `$JSC_HOME`(預設 `~/.jsc`),供 `jsc-log:worklog` 與 `jsc-log:stats` 取用。 -- 2.53.0 From 9854c05a7229c67870e03214affcfbe11f4f24d0 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 21 Aug 2026 13:08:43 +0800 Subject: [PATCH 3/9] =?UTF-8?q?docs(hooks):=20=E4=BB=A5=E7=B5=B1=E4=B8=80?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E6=94=B9=E5=AF=AB=E7=B9=81=E9=AB=94=E4=B8=AD?= =?UTF-8?q?=E6=96=87=20README=20=E8=88=87=20AGENTS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- AGENTS.md | 20 ++--- README.md | 230 ++++++------------------------------------------------ 2 files changed, 34 insertions(+), 216 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index a86a1f1..d8b5c8d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,15 +1,15 @@ -# jsc-template — 共用 Skills(跨 AI 助理) +# jsc-hooks — 給 AI 助理的指引 -本 repo 是一組以 **Agent Skills(`SKILL.md`)** 標準撰寫的共用 skills,可同時被 Claude Code、Codex、Antigravity、OpenCode 使用。 +本 repo 是 jsc 技能組的 `hooks` domain(跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄),可同時被 Claude Code / Codex / Copilot / Antigravity / Kiro 使用。 -## 給 AI 助理的指引 +## 規則 -- 所有可用的 skills 位於本 repo 的 `skills//SKILL.md`。 -- 在處理任務前,先比對使用者需求與各 skill `SKILL.md` frontmatter 的 `description`,若相符請載入並依其步驟執行。 -- **呼叫慣例**:在 Claude Code 與 Antigravity 中,這些 skill 以 `/jsc-template:` 呼叫;Codex 以 `$`、OpenCode 由模型依描述自動觸發 — 兩者沒有 `/jsc-template:` 前綴,不需強制加。 -- 完整清單與每個 skill 的用途,請見 `README.md` 的「Skills 目錄」。 +1. 所有交談與輸出內容基於 STE100 使用繁體中文:短句、一句一指令、主動語態、術語一致、UTF-8 無亂碼。 +2. 技能位於 `skills/{name}/SKILL.md`;處理任務前先比對需求與各技能的 `description`,相符就載入並依其步驟執行。 +3. 技能準則的唯一來源:`plugins/meta` 存取庫的 `references/guidelines.md`。 +4. 所有 hook 只放在 `jsc-hooks`;gitea 操作一律經由 `jsc-gitea` 的 `tools/gitea.sh`;問使用者一律依 `jsc-ask:ask` 的決策樹規則。 +5. 主 agent 不需要處理細節的流程,一律建立 sub agent 處理。 -## 慣例 +## 呼叫慣例 -- 新增 skill 一律放在 `skills//`,且 `` 使用小寫與連字號。 -- `description` 要寫清楚觸發條件(何時用、何時不用),這是跨助理自動載入的唯一依據。 +Claude Code / Antigravity:`/jsc-hooks:{name}`;Codex:`$name`;Copilot / Kiro / OpenCode:描述需求自動觸發。 diff --git a/README.md b/README.md index 6c6669e..cf2176e 100644 --- a/README.md +++ b/README.md @@ -1,228 +1,46 @@ -# jsc-template — 跨 AI 助理 Plugin 模板 +# jsc-hooks — 跨 CLI Hooks -一個可同時被 **Claude Code、Codex、Antigravity、OpenCode、GitHub Copilot** 安裝的 plugin 模板。 -核心是以 [Agent Skills(`SKILL.md`)](https://agentskills.io) 標準撰寫的共用 skills(唯一真實來源放在 `skills/`), -搭配各助理各自的 plugin manifest,讓**同一個 repo** 可用各家**原生 plugin CLI** 安裝。 -在 Claude Code 與 Antigravity 中,skill 以 **`/jsc-template:` 前綴**呼叫(例如 `/jsc-template:hello`)。 +jsc 技能組的 hooks domain:所有 hook **只放在這個 repo**(技能準則)。腳本為 POSIX shell,同時支援 stdin JSON(Claude 格式)與環境變數輸入,適用 claude / codex / copilot / antigravity / kiro。 ---- - -## 前綴與呼叫方式 - -| 助理 | 安裝方式 | 呼叫 | `/jsc-template:` 前綴 | -| --- | --- | --- | --- | -| Claude Code | `claude plugin`(marketplace) | `/jsc-template:` 或自動觸發 | ✅ | -| Codex | `codex plugin`(marketplace) | `$` 或 `/skills` 選單 | ❌(用 `$name`) | -| Antigravity | `agy plugin install` | `/jsc-template:` 或自動觸發 | ✅ | -| OpenCode | skills 目錄(複製/clone) | 描述需求自動觸發 | ❌(依名稱) | -| GitHub Copilot CLI | `copilot plugin`(marketplace) | 自然語言或 plugin skills | ❌(無 `/jsc-template:` 前綴) | - -> Codex 不支援自訂前綴(skill 以 `$name` 呼叫);OpenCode 由模型依描述自動呼叫;Copilot CLI 透過原生 plugin 安裝後以自然語言或 plugin skills 使用。三者皆**不強制**前綴。 - ---- - -## 目錄結構 - -同一個 repo 同時帶四種 manifest,彼此以路徑隔離、互不干擾;各助理都讀同一份 `skills/`。 - -``` -template/ -├── .claude-plugin/ -│ ├── plugin.json # Claude 外掛定義(name: "jsc-template") -│ └── marketplace.json # Claude marketplace(name: "template",source 指向本 repo) -├── .codex-plugin/ -│ └── plugin.json # Codex 外掛定義(name: "jsc-template",skills: "./skills") -├── .agents/plugins/ -│ └── marketplace.json # Codex marketplace(name: "template",url source 指向本 repo) -├── plugin.json # Antigravity 外掛定義(name: "jsc-template",skills: "./skills/") -├── skills/ # ★ 唯一真實來源:所有 skills -│ └── hello/SKILL.md -├── AGENTS.md # 跨助理共用指引 -└── README.md -``` - ---- - -## 安裝 / 更新 / 移除(各助理) - -> 指令中的 repo 網址換成你的:`https://gitea.jsc.idv.tw/plugins/template.git` -> -> **Claude / Codex 從 git URL 安裝(會 clone 遠端),請先把本 repo `push` 到 gitea。** -> **Antigravity 的 `agy plugin install ` 目前只支援 github.com**;gitea 請改用「clone + 本地路徑」(見 Antigravity 節)。 -> 本機/離線:Claude 可用本地路徑加 marketplace;Antigravity 用本地路徑安裝。 - -> **⚠ 從 0.0.1 升上來的人請先移除再安裝。** 0.0.2 起 marketplace 名由 `jsc-plugins` 改為 `template` -> (舊名與 `jsc-persona` 的 marketplace 撞名)。各助理以 `@` 當安裝識別鍵, -> 改名後是兩筆獨立條目,**不能用 update 遷移**: -> -> ```bash -> claude plugin uninstall jsc-template@jsc-plugins -> claude plugin marketplace remove jsc-plugins # 若你沒有裝 jsc-persona 才移除,它也用這個名字 -> claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/template.git -> claude plugin install jsc-template@template -> ``` -> -> 移除後記得清掉 `~/.claude/settings.json` 裡 `enabledPlugins` 的舊鍵 `jsc-template@jsc-plugins`, -> 並重開工作階段。Codex/Copilot 同理(`remove`/`uninstall` 後重新 `add`+`install`)。 - -### Claude Code +## 安裝 ```bash -# 安裝 -claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/template.git -claude plugin install jsc-template@template - -# 更新 -claude plugin marketplace update template -claude plugin update jsc-template@template - -# 移除 -claude plugin uninstall jsc-template@template -claude plugin marketplace remove template +claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/hooks.git +claude plugin install jsc-hooks@hooks ``` -- 工作階段內 slash 版(等價):把 `claude plugin` 換成 `/plugin`。 -- 本機開發(免 push):`claude plugin marketplace add C:\Users\h3285\source\repos.plugins\template`(本地路徑)後再 install。 -- **呼叫**:`/jsc-template:`(例 `/jsc-template:hello`)。 +其他 CLI(codex / copilot / antigravity / kiro)與批次安裝、更新、解除安裝:使用 `/jsc-cli:deploy`。 -### Codex +## Hooks -```bash -# 安裝 -codex plugin marketplace add https://gitea.jsc.idv.tw/plugins/template.git -codex plugin add jsc-template@template - -# 更新(重新抓取 marketplace 的 git 快照) -codex plugin marketplace upgrade template - -# 移除 -codex plugin remove jsc-template@template -codex plugin marketplace remove template -``` - -- 安裝 token `jsc-template@template` = plugin 名(`.codex-plugin/plugin.json` 的 `name`)@ marketplace 名(`.agents/plugins/marketplace.json` 的 `name`)。 -- 本 repo 的 Codex marketplace 以 `url` 來源指向自己,故 Codex **一律從 gitea 安裝**(需先 push);安裝後重啟 Codex。 -- **呼叫**:`$`(例 `$hello`),或用 `/skills` 選單。 - -### Antigravity(`agy`) - -> `agy plugin install ` 目前**只支援 github.com**;gitea 等自架 git 不支援 URL 安裝,請先 `git clone` 再用**本地路徑**安裝。 - -```bash -# 安裝:clone 後用本地路徑 -git clone https://gitea.jsc.idv.tw/plugins/template.git ~/plugins/template -agy plugin install ~/plugins/template - -# 更新(agy 無 update 子指令 → git pull 後重裝) -git -C ~/plugins/template pull -agy plugin uninstall jsc-template -agy plugin install ~/plugins/template - -# 移除 -agy plugin uninstall jsc-template -``` - -- 若把 skills 放到 GitHub,則可直接 `agy plugin install https://github.com//`。 -- 其他:`agy plugin list`、`agy plugin enable jsc-template` / `disable jsc-template`、`agy plugin validate `。安裝後重啟工作階段。 -- **呼叫**:`/jsc-template:`(例 `/jsc-template:hello`)或依描述自動觸發。 - -### OpenCode - -OpenCode 的「plugin」是 TypeScript/npm 套件,不適用於 skill 包;skills 改用**目錄安裝**。 -OpenCode 會讀 `~/.config/opencode/skills/`(也會讀 `~/.claude/skills/`、`~/.agents/skills/`)。 - -```bash -# 安裝 -git clone https://gitea.jsc.idv.tw/plugins/template.git ~/plugins/template -mkdir -p ~/.config/opencode/skills -cp -r ~/plugins/template/skills/* ~/.config/opencode/skills/ - -# 更新 -git -C ~/plugins/template pull -cp -r ~/plugins/template/skills/* ~/.config/opencode/skills/ - -# 移除 -rm -rf ~/.config/opencode/skills/hello -``` - -> **Windows PowerShell**:`cp -r A B` → `Copy-Item A B -Recurse -Force`、`rm -rf X` → `Remove-Item X -Recurse -Force`、`~` → `$HOME`。 - -- **呼叫**:直接描述需求,模型會依 skill 描述自動透過 skill 工具呼叫。 - -### GitHub Copilot CLI - -Copilot CLI 支援與 Claude Code 類似的原生 plugin / marketplace 指令,可直接從 marketplace 安裝、更新與移除本 plugin。 - -```bash -# 安裝 -copilot plugin marketplace add https://gitea.jsc.idv.tw/plugins/template.git -copilot plugin install jsc-template@template - -# 更新 -copilot plugin marketplace update template -copilot plugin update jsc-template@template - -# 移除 -copilot plugin uninstall jsc-template@template -copilot plugin marketplace remove template -``` - -- 安裝 token `jsc-template@template` = plugin 名(plugin manifest 的 `name`)@ marketplace 名。 -- `copilot plugin marketplace add` 支援 GitHub `owner/repo`、git URL 與本地路徑;Gitea repo 可用上方 HTTPS URL。 -- **呼叫**:在 Copilot CLI 中用自然語言描述需求,例如 `copilot -i "跑 hello 確認 plugin 裝好了"`。 - ---- - -## 用 CLI 直接執行 skill(headless / 一次性) - -安裝好之後,不必進互動介面,一行指令就能叫某個 skill 跑完並印出結果: - -| 助理 | headless 指令 | 執行 `hello` skill | +| 腳本 | 事件 | 作用 | | --- | --- | --- | -| Claude Code | `claude -p ""` | `claude -p "/jsc-template:hello"` | -| Codex | `codex exec ""` | `codex exec '$hello'` | -| Antigravity | `agy -p ""` | `agy -p "/jsc-template:hello"` | -| OpenCode | `opencode run ""` | `opencode run "用 hello skill 打個招呼"` | -| GitHub Copilot CLI | `copilot -p ""` | `copilot -p "用 hello skill 打個招呼"` | +| `hooks/ste100-guard.sh` | UserPromptSubmit | 注入 STE100 繁體中文輸出規則(hook > prompt 強制層) | +| `hooks/session-timer.sh` | SessionStart / Stop / SessionEnd | 記錄工作階段起訖;`report` 子指令供 `jsc-log:worklog` 取花費時間 | +| `hooks/skill-usage.sh` | PostToolUse(Skill) | 記錄技能使用與呼叫鏈到 `$JSC_HOME/usage/*.jsonl`,供 `jsc-log:stats` 統計 | -- Claude / Antigravity 支援 `/jsc-template:` 前綴,直接 `-p "/jsc-template:"` 即可。 -- Codex 以 `$` 觸發;在 shell 請用**單引號**避免 `$` 被展開:`codex exec '$hello'`。 -- OpenCode 與 Copilot 沒有前綴,用自然語言描述需求;Copilot CLI 會讀取已安裝 plugin 提供的 skills。 -- 帶引數就接在後面,例如 `claude -p "/jsc-template:hello 參數"`、`codex exec '$hello 參數'`。 - ---- +Claude 由 `hooks/hooks.json` 自動接線;其他 CLI 用 `hooks-install` 技能接線或降級為規則檔。 ## Skills 目錄 -> 此區塊列出本 plugin 內含的所有 skills(名稱/描述/使用方法)。 -> 新增或修改 skill 後,請同步手動更新標記之間的內容。 +呼叫方式:Claude / Antigravity `/jsc-hooks:{name}`;Codex `${name}`;Copilot / Kiro 描述需求自動觸發。 -### `hello` +### `hooks-install` -範例 skill,用來驗證 jsc plugin 是否安裝成功,也是新增 skill 的範本。當使用者輸入 hello、想測試 plugin、或想看 skill 模板長什麼樣子時觸發;回覆一句問候並簡述此 plugin 的用途。 - -- **Claude Code / Antigravity**:`/jsc-template:hello` -- **Codex**:`$hello`,或用 `/skills` 選單 -- **OpenCode / GitHub Copilot CLI**:描述需求自動觸發 +把三支 hook 接線到所有已安裝的 CLI:偵測 CLI 後逐一套用原生 hook 設定,無 hook 系統的 CLI 降級為規則檔(以 `` 標記整段取代,不重複追加)。 ---- +## 環境變數 -## 新增一個 skill +| 變數 | 用途 | 未設定時 | +| --- | --- | --- | +| `JSC_HOME` | Hook 資料目錄 | 預設 `~/.jsc` | +| `JSC_CLI` / `JSC_SESSION_ID` / `JSC_SKILL` | 非 Claude CLI 接線時由 wrapper 設定 | 安靜降級 | -1. 複製範本:`cp -r skills/hello skills/` -2. 編輯 `skills//SKILL.md` 的 frontmatter: - - `name`:小寫、數字、連字號(`-`),最長 64 字元。**這就是 Claude Code / Antigravity 的 `/jsc-template:`**。 - - `description`:第三人稱,寫清楚「何時用、何時不用」與觸發關鍵字 — 這是各助理自動載入的唯一依據。 -3. 在內文寫下 skill 的具體步驟。 -4. 手動把這個 skill 補進上方「Skills 目錄」區塊。 -5. **bump 版本並 push**:各助理都以 git 內容/版本判斷更新,請把 `.claude-plugin/plugin.json`、`.codex-plugin/plugin.json`、`plugin.json` 三個 manifest 的 `version` 一起 bump,commit 後 push 到 gitea。 -6. 讓各助理更新: - - Claude:`claude plugin update jsc-template@template` - - Codex:`codex plugin marketplace upgrade template` - - Antigravity:`git -C ~/jsc-plugin pull && agy plugin uninstall jsc-template && agy plugin install ~/jsc-plugin` - - OpenCode:`git pull` 後重新複製 `skills/` - - Copilot:`copilot plugin marketplace update template && copilot plugin update jsc-template@template` +## 相關 domain + +- `jsc-cli`:CLI 偵測(`tools/detect-clis.sh`) +- `jsc-log`:讀取本 domain 產出的工時與用量資料 -- 2.53.0 From c628361f52a75e865c3db2ef9c0dcd1f9e4ccb35 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 21 Aug 2026 14:03:36 +0800 Subject: [PATCH 4/9] =?UTF-8?q?chore(hooks):=20=E7=89=88=E6=9C=AC=E8=99=9F?= =?UTF-8?q?=E6=94=B9=E7=82=BA=200.0.1=20=E4=B8=A6=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=80=8B=E5=88=A5=20marketplace=EF=BC=88=E7=B5=B1=E4=B8=80?= =?UTF-8?q?=E7=82=BA=20jsc=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .agents/plugins/marketplace.json | 12 ------------ .claude-plugin/marketplace.json | 14 -------------- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- plugin.json | 2 +- 5 files changed, 3 insertions(+), 29 deletions(-) delete mode 100644 .agents/plugins/marketplace.json delete mode 100644 .claude-plugin/marketplace.json diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json deleted file mode 100644 index 57968a1..0000000 --- a/.agents/plugins/marketplace.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "hooks", - "plugins": [ - { - "name": "jsc-hooks", - "source": { - "source": "url", - "url": "https://gitea.jsc.idv.tw/plugins/hooks.git" - } - } - ] -} diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json deleted file mode 100644 index 3bd3dee..0000000 --- a/.claude-plugin/marketplace.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "hooks", - "description": "jsc 技能組 hooks domain 的 marketplace。", - "owner": { - "name": "JSC" - }, - "plugins": [ - { - "name": "jsc-hooks", - "source": "./", - "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄" - } - ] -} diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index bd1ad1a..0f9198a 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-hooks", - "version": "0.2.0", + "version": "0.0.1", "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄", "skills": "./skills", "author": { diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 6c42010..39f01b3 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-hooks", - "version": "0.2.0", + "version": "0.0.1", "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄", "skills": "./skills" } diff --git a/plugin.json b/plugin.json index 909495b..8959b93 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-hooks", - "version": "0.2.0", + "version": "0.0.1", "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄", "skills": "./skills/" } -- 2.53.0 From de3c53f1df8c588717b4fe8e9b6e677ad85e4f6a Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 21 Aug 2026 14:03:36 +0800 Subject: [PATCH 5/9] =?UTF-8?q?docs(hooks):=20README=20=E5=AE=89=E8=A3=9D/?= =?UTF-8?q?=E6=9B=B4=E6=96=B0/=E7=A7=BB=E9=99=A4=E6=94=B9=E7=82=BA?= =?UTF-8?q?=E6=AF=8F=E6=8C=87=E4=BB=A4=E4=B8=80=E8=A1=8C=EF=BC=88=E4=BA=94?= =?UTF-8?q?=E5=80=8B=20CLI=EF=BC=89=E4=B8=A6=E7=82=BA=E7=9B=B8=E9=97=9C=20?= =?UTF-8?q?domain=20=E5=8A=A0=E4=B8=8A=20repo=20=E9=80=A3=E7=B5=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- README.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index cf2176e..0bc4e16 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,19 @@ jsc 技能組的 hooks domain:所有 hook **只放在這個 repo**(技能準則)。腳本為 POSIX shell,同時支援 stdin JSON(Claude 格式)與環境變數輸入,適用 claude / codex / copilot / antigravity / kiro。 -## 安裝 +## 安裝 / 更新 / 移除 -```bash -claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/hooks.git -claude plugin install jsc-hooks@hooks -``` +Marketplace 統一為 `jsc`(https://gitea.jsc.idv.tw/plugins/jsc.git),安裝 token 為 `jsc-hooks@jsc`。每個指令一行: -其他 CLI(codex / copilot / antigravity / kiro)與批次安裝、更新、解除安裝:使用 `/jsc-cli:deploy`。 +| CLI | 安裝 | 更新 | 移除 | +| --- | --- | --- | --- | +| claude | `claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/jsc.git && claude plugin install jsc-hooks@jsc` | `claude plugin marketplace update jsc && claude plugin update jsc-hooks@jsc` | `claude plugin uninstall jsc-hooks@jsc` | +| codex | `codex plugin marketplace add https://gitea.jsc.idv.tw/plugins/jsc.git && codex plugin add jsc-hooks@jsc` | `codex plugin marketplace upgrade jsc` | `codex plugin remove jsc-hooks@jsc` | +| copilot | `copilot plugin marketplace add https://gitea.jsc.idv.tw/plugins/jsc.git && copilot plugin install jsc-hooks@jsc` | `copilot plugin marketplace update jsc && copilot plugin update jsc-hooks@jsc` | `copilot plugin uninstall jsc-hooks@jsc` | +| antigravity | `git clone https://gitea.jsc.idv.tw/plugins/hooks.git ~/plugins/hooks && agy plugin install ~/plugins/hooks` | `git -C ~/plugins/hooks pull && agy plugin uninstall jsc-hooks && agy plugin install ~/plugins/hooks` | `agy plugin uninstall jsc-hooks` | +| kiro | `kiro-cli plugin marketplace add https://gitea.jsc.idv.tw/plugins/jsc.git && kiro-cli plugin install jsc-hooks@jsc` | `kiro-cli plugin marketplace update jsc && kiro-cli plugin update jsc-hooks@jsc` | `kiro-cli plugin uninstall jsc-hooks@jsc` | + +> antigravity 不支援 gitea URL 安裝,改用本地 clone 路徑。批次操作五個 CLI:使用 `/jsc-cli:deploy`。 ## Hooks @@ -42,5 +47,5 @@ Claude 由 `hooks/hooks.json` 自動接線;其他 CLI 用 `hooks-install` 技 ## 相關 domain -- `jsc-cli`:CLI 偵測(`tools/detect-clis.sh`) -- `jsc-log`:讀取本 domain 產出的工時與用量資料 +- [`jsc-cli`](https://gitea.jsc.idv.tw/plugins/cli):CLI 偵測(`tools/detect-clis.sh`) +- [`jsc-log`](https://gitea.jsc.idv.tw/plugins/log):讀取本 domain 產出的工時與用量資料 -- 2.53.0 From 58265e83e846b9ca73f9c9ebd7d95779a9973d67 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 21 Aug 2026 14:13:27 +0800 Subject: [PATCH 6/9] =?UTF-8?q?feat(hooks):=20ste100-guard=20=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E6=96=87=E5=AD=97=E6=94=B9=E7=82=BA=E6=93=AC=E4=BA=BA?= =?UTF-8?q?=E5=8F=B0=E7=81=A3=E6=84=9F=E7=89=88=EF=BC=88=E5=8F=B0=E7=81=A3?= =?UTF-8?q?=E7=94=A8=E8=AA=9E=E3=80=81=E5=85=A8=E5=BD=A2=E6=A8=99=E9=BB=9E?= =?UTF-8?q?=E3=80=81=E5=8E=BB=20AI=20=E5=91=B3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- AGENTS.md | 2 +- hooks/ste100-guard.sh | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index d8b5c8d..89f890e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ ## 規則 -1. 所有交談與輸出內容基於 STE100 使用繁體中文:短句、一句一指令、主動語態、術語一致、UTF-8 無亂碼。 +1. 所有交談與輸出內容使用 STE100 繁體中文,帶擬人台灣感:短句、一句一指令、台灣用語、全形標點、去 AI 味、直接講重點。完整規則的唯一來源:`plugins/meta` 的 `references/ste100.md`。 2. 技能位於 `skills/{name}/SKILL.md`;處理任務前先比對需求與各技能的 `description`,相符就載入並依其步驟執行。 3. 技能準則的唯一來源:`plugins/meta` 存取庫的 `references/guidelines.md`。 4. 所有 hook 只放在 `jsc-hooks`;gitea 操作一律經由 `jsc-gitea` 的 `tools/gitea.sh`;問使用者一律依 `jsc-ask:ask` 的決策樹規則。 diff --git a/hooks/ste100-guard.sh b/hooks/ste100-guard.sh index c9e89e4..6746cf4 100755 --- a/hooks/ste100-guard.sh +++ b/hooks/ste100-guard.sh @@ -2,5 +2,6 @@ # ste100-guard.sh — 於每次使用者提示時注入語言規則(hook > prompt 的強制層)。 # Claude: UserPromptSubmit 的 stdout 會成為額外 context。 # 其他 CLI: 由 hooks-install 以各自的規則檔(AGENTS.md 等)落地,本腳本仍可被 wrapper 呼叫。 -echo "[jsc] 輸出規則:所有回覆基於 STE100 使用繁體中文(短句、一句一指令、主動語態、術語一致、UTF-8 無亂碼)。" +# 完整規則的唯一來源:jsc-meta 的 references/ste100.md。 +echo "[jsc] 輸出規則:STE100 繁體中文,擬人台灣感。短句、一句一指令、主動語態、術語一致;台灣用語(預設、支援、相容、資訊);全形標點;去 AI 味(不用「總的來說」「首先/其次/最後」開場收尾套路、不諂媚);直接講重點,UTF-8 無亂碼。完整規則見 jsc-meta 的 references/ste100.md。" exit 0 -- 2.53.0 From f395c1c2cb18fe562c4df9452ac579db4e00a299 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 21 Aug 2026 14:29:45 +0800 Subject: [PATCH 7/9] docs(hooks): translate SKILL.md into English per guidelines Co-Authored-By: Claude Fable 5 --- skills/hooks-install/SKILL.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/skills/hooks-install/SKILL.md b/skills/hooks-install/SKILL.md index 5583b83..4c51e44 100644 --- a/skills/hooks-install/SKILL.md +++ b/skills/hooks-install/SKILL.md @@ -3,28 +3,28 @@ name: hooks-install description: Wire jsc hooks (STE100 guard, session timer, skill usage logger) into every installed AI CLI. Detect CLIs via jsc-cli detect-clis.sh, then apply native hook config per CLI or fall back to instruction files. Use after installing or updating the jsc plugin set; not for writing new hooks. --- -# hooks-install — 將 jsc hooks 接線到所有已安裝的 CLI +# hooks-install — wire jsc hooks into every installed CLI -目標:讓三支 hook(`ste100-guard.sh`、`session-timer.sh`、`skill-usage.sh`)在每個 CLI 生效。 -細節流程**必須以 sub agent 執行**,主 agent 只回報結果摘要。 +Goal: make the three hooks (`ste100-guard.sh`, `session-timer.sh`, `skill-usage.sh`) effective in every CLI. +The detailed flow **MUST run as a sub agent**; the main agent only reports the summary. -## 步驟 +## Steps -1. 執行 `jsc-cli/tools/detect-clis.sh` 取得已安裝的 CLI 與路徑。 -2. 對每個 CLI 依下表接線(hook 優先,無 hook 系統就降級為規則檔): +1. Run `jsc-cli/tools/detect-clis.sh` to get the installed CLIs and their paths. +2. Wire each CLI per the table below (hooks first; degrade to an instruction file when the CLI has no hook system): -| CLI | 接線方式 | +| CLI | Wiring | | --- | --- | -| claude | plugin 安裝時自動載入 `jsc-hooks/hooks/hooks.json`,只需驗證:`claude plugin list` 有 `jsc-hooks` 且 `/hooks` 顯示已註冊 | -| codex | `~/.codex/config.toml` 設定 `notify` 指向 `session-timer.sh mark`(帶 `JSC_CLI=codex`);STE100 規則追加到 `~/.codex/AGENTS.md`(prompt 降級) | -| copilot | 無 hook 系統:STE100 規則追加到 `~/.config/copilot/copilot-instructions.md`(prompt 降級) | -| antigravity | 無公開 hook 系統:STE100 規則追加到全域 rules 檔(prompt 降級) | -| kiro | 於工作區 `.kiro/hooks/` 建立 agent hook,觸發時執行對應腳本(帶 `JSC_CLI=kiro`) | +| claude | the plugin loads `jsc-hooks/hooks/hooks.json` automatically on install; verify only: `claude plugin list` shows `jsc-hooks` and `/hooks` shows the registrations | +| codex | set `notify` in `~/.codex/config.toml` to `session-timer.sh mark` (with `JSC_CLI=codex`); append the STE100 rule to `~/.codex/AGENTS.md` (prompt fallback) | +| copilot | no hook system: append the STE100 rule to `~/.config/copilot/copilot-instructions.md` (prompt fallback) | +| antigravity | no public hook system: append the STE100 rule to the global rules file (prompt fallback) | +| kiro | create an agent hook under the workspace `.kiro/hooks/` that runs the matching script (with `JSC_CLI=kiro`) | -3. 規則檔追加內容一律使用 `ste100-guard.sh` 的輸出文字,且以 `` 標記包住,重複執行時整段取代不重複追加。 -4. 回報每個 CLI 的接線結果(成功 / 降級為 prompt / 跳過原因)。 +3. The appended rule text is always the exact output of `ste100-guard.sh` (a Traditional Chinese literal). Wrap it in `` markers; on re-run, replace the whole block instead of appending again. +4. Report the wiring result for every CLI: succeeded, degraded to prompt, or the skip reason. -## 注意 +## Notes -- Hook 腳本同時接受 stdin JSON 與環境變數(`JSC_CLI`、`JSC_SESSION_ID`、`JSC_SKILL`),wrapper 只需設環境變數。 -- 資料落在 `$JSC_HOME`(預設 `~/.jsc`),供 `jsc-log:worklog` 與 `jsc-log:stats` 取用。 +- The hook scripts accept both stdin JSON and environment variables (`JSC_CLI`, `JSC_SESSION_ID`, `JSC_SKILL`); a wrapper only needs to set the variables. +- Data lands in `$JSC_HOME` (default `~/.jsc`), consumed by `jsc-log:worklog` and `jsc-log:stats`. -- 2.53.0 From 4ffc8459e1d82548bbb247963349e987d3f613cf Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 21 Aug 2026 14:29:45 +0800 Subject: [PATCH 8/9] =?UTF-8?q?style(hooks):=20=E4=B8=AD=E6=96=87=E4=B8=A6?= =?UTF-8?q?=E5=88=97=E6=94=B9=E9=A0=93=E8=99=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0bc4e16..4866ea4 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ jsc 技能組的 hooks domain:所有 hook **只放在這個 repo**(技能準則)。腳本為 POSIX shell,同時支援 stdin JSON(Claude 格式)與環境變數輸入,適用 claude / codex / copilot / antigravity / kiro。 -## 安裝 / 更新 / 移除 +## 安裝、更新、移除 Marketplace 統一為 `jsc`(https://gitea.jsc.idv.tw/plugins/jsc.git),安裝 token 為 `jsc-hooks@jsc`。每個指令一行: -- 2.53.0 From 805befc13cb848754c8111bf393019f98ac26bea Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 21 Aug 2026 14:37:47 +0800 Subject: [PATCH 9/9] =?UTF-8?q?chore(hooks):=20=E5=8A=A0=E5=85=A5=E7=B5=B1?= =?UTF-8?q?=E4=B8=80=20jsc=20marketplace=20=E5=89=AF=E6=9C=AC=EF=BC=88?= =?UTF-8?q?=E8=88=87=E6=AD=A3=E6=9C=AC=E4=B8=80=E8=87=B4=EF=BC=8C=E4=BB=BB?= =?UTF-8?q?=E4=B8=80=20repo=20=E5=8F=AF=E4=BD=9C=E8=A8=BB=E5=86=8A?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .agents/plugins/marketplace.json | 75 +++++++++++++++++++++++++++ .claude-plugin/marketplace.json | 89 ++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 .agents/plugins/marketplace.json create mode 100644 .claude-plugin/marketplace.json diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json new file mode 100644 index 0000000..12df680 --- /dev/null +++ b/.agents/plugins/marketplace.json @@ -0,0 +1,75 @@ +{ + "name": "jsc", + "plugins": [ + { + "name": "jsc-ask", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/ask.git" + } + }, + { + "name": "jsc-cli", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/cli.git" + } + }, + { + "name": "jsc-git", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/git.git" + } + }, + { + "name": "jsc-gitea", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/gitea.git" + } + }, + { + "name": "jsc-hooks", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/hooks.git" + } + }, + { + "name": "jsc-log", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/log.git" + } + }, + { + "name": "jsc-meta", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/meta.git" + } + }, + { + "name": "jsc-pkg", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/pkg.git" + } + }, + { + "name": "jsc-review", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/review.git" + } + }, + { + "name": "jsc-sdlc", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/sdlc.git" + } + } + ] +} diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json new file mode 100644 index 0000000..28bb223 --- /dev/null +++ b/.claude-plugin/marketplace.json @@ -0,0 +1,89 @@ +{ + "name": "jsc", + "description": "jsc 跨 AI 助理技能組的統一 marketplace(claude / codex / copilot / antigravity / kiro)。", + "owner": { + "name": "JSC" + }, + "plugins": [ + { + "name": "jsc-ask", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/ask.git" + }, + "description": "決策樹問詢與問詢紀錄(QUESTION_* wiki 頁)" + }, + { + "name": "jsc-cli", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/cli.git" + }, + "description": "CLI 偵測、模型能力標籤與技能庫批次部署" + }, + { + "name": "jsc-git", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/git.git" + }, + "description": "Commit 分組認可與 Push Request 建立" + }, + { + "name": "jsc-gitea", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/gitea.git" + }, + "description": "Gitea API 工具、Wiki 讀寫與存取庫批次同步" + }, + { + "name": "jsc-hooks", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/hooks.git" + }, + "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄" + }, + { + "name": "jsc-log", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/log.git" + }, + "description": "工作日誌(LOG_* wiki 頁)與技能使用統計" + }, + { + "name": "jsc-meta", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/meta.git" + }, + "description": "技能組自我管理:新建/更新/刪除技能與技能準則" + }, + { + "name": "jsc-pkg", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/pkg.git" + }, + "description": "套件批次更新(nodejs/python/dotnet),失敗還原" + }, + { + "name": "jsc-review", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/review.git" + }, + "description": "程式碼審查:Refactoring 壞味道六組 + 註解規範 + 淺模組" + }, + { + "name": "jsc-sdlc", + "source": { + "source": "url", + "url": "https://gitea.jsc.idv.tw/plugins/sdlc.git" + }, + "description": "開發生命週期:規劃/分析/實作/維護(wiki 追蹤)" + } + ] +} -- 2.53.0