76adc749b0
c9128 複驗指出:雲端那次只改了 6 支 shell 的 sed 寫法,漏了 8 支 Python 的 re.search(r"//[^:/]+:([^@]+)@") 寫法。remote 清乾淨後這 8 支會靜默拿到 空字串 → 401,正是票上 2026-08-13「被讀成找不到/不存在」那種壞法;雲端有 環境變數所以測不出本機(只有 .env)的壞法。 - 新增 hooks/lib/gitea_token.py:Python 端唯一 token 來源,與 scripts/lib/gitea-token.sh 同一解析順序(env → $CLAUDE_PROJECT_DIR/.env → git 根的 .env),絕不從 remote URL 抽。 - 8 支改用它:scripts/ticket、debt-worklist、milestone-account、pr-verdict、 release-manifest、isep-nag、isep-notify、hooks/lib/release_chain.py。 release_chain 的 import 做成防禦式(旁邊沒有 gitea_token.py 也能載入, 讀 tag/release 一律匿名),token_from_env_or_remote 保留簽章、改走新來源。 - 測試:新增 scripts/test-gitea-token.sh(16 條,Python+shell 兩份實作、 解析順序、髒 remote 不准解出、8 支都走得過 token 步);docs/TESTING.md A44。 beacon 測試的 mkplugin 一併複製 gitea_token.py(release_chain 現在會 import 它)。 驗過(remote 乾淨+無環境變數+.env 有 token):ticket mine/isep-nag/ isep-notify/milestone-account/pr-verdict/debt-worklist 都拿得到 token、 走得過 token 步。回歸:test-gitea-token 16/16、milestone-account 23/23、 release-manifest 21/21、debt-worklist 47/47、release-check 14/14、 release-ship 14/14、ticket-pick 84/84、ticket-triage 80/80、 ticket-repo-arg 7/7、ticket-handoff-writeback 49/49、 ticket-where-seen 17/17、isep-notify-botapi 10/10、 beacon 33/33、pr-verdict-guard 52/52。 README scripts 數在本樹實數=68(main 66→branch 67 加 git-credential-gitea.sh →本次 68 加 test-gitea-token.sh;README 舊值 65 在 main 上就已 stale)。 hooks 仍 62,hooks-inventory.md 不動。 版本號待總管定(改到的是會被載入的 hooks/lib 與 scripts,需升版才會傳到安裝的那份)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SwZx8MkV84Cz2Mf4sDU4if