5 Commits

Author SHA1 Message Date
Leo 47ed778cc4 改走「直接複製進薄殼 repo」,並修掉一支會偷跑指令的閘
leo 2026-08-21:「你應該把 Plugin 直接裝進 Github repo,從本地直接複製就好了」

為什麼這條對:雲端 session 是 fresh clone 薄殼 repo,而 setup script 讀不到
環境變數。走 marketplace 就得同時處理憑證、repo 可見性、環境快取三件事——
今天這三件各失敗過一次。複製進 repo 之後,clone 下來就有,沒有任何前置條件。

新增 scripts/vendor-to-shell.py:
  把 hooks/skills/commands/scripts/.claude-plugin 整份複製到 .claude/isep/,
  並把 54 條 hook 註冊改寫成薄殼裡的絕對路徑。
  保留 CLAUDE_PLUGIN_ROOT 這個變數名(44 支閘內部靠它定位自己的 lib/),
  只是把它指到複製過來的那份。

冒煙測試(54 條註冊全跑一遍,找路徑壞掉的):
  第一輪 4 條壞 → 3 條是 log 目錄不存在(已補建 .claude/hooks/)
                  1 條在真身也一樣壞 ⇒ 不是複製造成的
  第二輪 0 條壞

順手修掉那支既有 bug:wiki-first-search.sh
  python3 -c 用雙引號,註解裡的反引號被 shell 當指令替換
  ⇒ 這支閘每次觸發都在偷跑 bge-m3 與 head changelog.md。
  改成全形引號後實測靜默 exit 0。
  (crude grep 掃出 6 支疑似,但冒煙測試證明只有這一支真的中——
    再一次:證據勝過掃描。)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:51:00 +08:00
Leo 03d9782f22 查了官方文件才發現:setup script 根本讀不到環境變數,而 exit 1 會鎖死 session
leo 問「寫以前為什麼不查」——沒有藉口,我假設了兩件事都沒查,兩件都是錯的。

① setup script 讀不到 Environment variables
   官方原文:Each session copies the environment's values once, at startup,
   into ordinary environment variables
   而 setup script 是 before Claude Code launches 跑的 ⇒ 注入在它之後。
   ⇒ 把 token 放進 Environment variables 再要 setup script 讀,永遠讀不到。
   證據吻合:leo 的變數設對了、值也跟本機同一把(長度 40、頭尾一致),
   而腳本回報找不到。

② exit 非零會讓整個 session 開不起來
   官方原文:Exit zero: if the script exits non-zero, the session fails to start.
   前一版為了大聲失敗用 exit 1 ⇒ 直接造成 Session initialization failed。
   ⇒ 現在一律 exit 0,失敗寫進 /tmp/.isep-setup-report。

本機三向實測:
  無變數(雲端真實情況)→ exit 0,印出說明,不擋 session
  有變數(未來平台若改行為)→ 設 git 認證並驗證
  ls-remote 加 timeout 45(本機曾掛住近 4 分鐘)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:39:48 +08:00
Leo 36d8e05a32 認證驗證加 timeout:掛住比失敗更糟
2026-08-21 本機隔離測試:git ls-remote 掛住近 4 分鐘不回。
setup 卡在那裡看起來像還在跑,不會有人知道它壞了。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:34:34 +08:00
Leo daa1674a20 雲端零閘的兩個真因:setup 從不驗證自己+沒有任何 release 撐版本號
2026-08-20 雲端 session 的閘全滅,而三個驗證步驟全部回綠。
今晚在隔離 HOME(GIT_CONFIG_NOSYSTEM=1)重現,把兩件事分開了:

① setup script 的寫法是對的
   裸環境失敗、加了 url.insteadOf 就成功 —— x-access-token 這個使用者名稱
   Gitea 也接受。所以先前我對 leo 說「URL 重寫沒作用到 marketplace 這條路徑」
   是錯的,這裡更正。
   (前兩次測試之所以誤導,是因為 /etc/gitconfig 的 macOS keychain helper
   還在幫忙 —— 「隔離 HOME」並沒有隔離系統層設定。同一個病第三次。)

② 真正的缺陷是這支腳本從不驗證自己
   設完就結束。token 沒生效也不出聲 ⇒ setup log 一片綠、
   session 開起來才發現 marketplace 拉不下來,而那時已經沒有任何線索。
   本次加兩道自我驗證:git 認證通不通、marketplace 有沒有就位,
   任一不通就 exit 1 並印出該查什麼。

③ 新增 isep-presence-beacon.sh(信標,不是閘)
   SessionStart 報「ISEP v幾 已載入、幾支閘」。
   它的全部意義是鑑別力:這行住在 plugin 裡,所以看得到就一定載入了,
   看不到就是零閘。不像 git tag(在三支閘的白名單裡,閘死了照樣過)。

④ plugin.json 0.0.0 → 0.3.0
   查清楚了:0.0.0 不是漂移,是誠實 —— ISEP 一個 tag 都沒有,從沒發過 release。
   而這正是「雲端拿不到更新」的另一半:claude plugin update 比對版本號,
   沒有 release 就永遠沒有新號碼可比。所以這一刀的收工是真的打 tag 發版。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 22:59:21 +08:00
Leo 627f924342 docs(cloud): 雲端 session 用 claude plugin marketplace 裝真身 ISEP,不再複製薄殼
inkstone/ISEP#5 —— 用 code-on-web 的 Setup script(session 啟動前跑)+
claude plugin marketplace add/install 把 ISEP 裝成 user-scope plugin,
內容 100% 來自 ISEP repo HEAD,滿足 docs/governance §11.3 三條硬規則。

本機隔離 $HOME 實測兩輪(token-in-URL、git url.insteadOf 重寫兩種認證寫法皆可行),
skills/commands/hooks 逐條數字對上 ISEP 當時的 main HEAD(含途中 main 前進,
下次 marketplace update 立刻拿到新內容,證明非快照複製)。

明確未驗:真實 code-on-web session、hook runtime 攔截、7 天 environment 快照
新鮮度窗口——皆記在 docs/cloud-session-bootstrap.md「沒驗到的」段。

不動 youlinhsieh/inkstoneco(新機制不需要它)、不 push GitHub、不 push main。
2026-08-20 13:41:35 +08:00