Commit Graph

3 Commits

Author SHA1 Message Date
Claude 76adc749b0 ISEP#47: 補齊 8 支 Python 也從 env/.env 取 token,不再從 remote URL 抽
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
2026-09-19 03:59:51 +00:00
isep-hand d4bf172990 主線成員改由相依邊決定,不靠同名里程碑;adopt 別 repo 的票=加相依到 hub 票;帳本落在 InkStoneCo/system-dev(inkstone/ISEP#133 → 6743)
leo 2026-09-07:「拆,誰說『同名跨 repo 是 mainline 機制的一部分』,早就定了只有一個
milestone,不同 repo 用指針」。上一版 scripts/mainline 檔頭把現場的樣子(5 個同名)寫成
「既有做法」,成員也照標題跨 repo 收;總管照它做、抄進 ops-facts、還在 arcrun-rag 補建了一個同名的。

改了什麼(判準全部是 Gitea 欄位,沒有標題比對):
- hooks/lib/mainline.py:collect_members()=hub 里程碑裡的票+hub 票,沿 /dependencies 邊
  (跨 repo)收下去;belongs() 要同時拿到「掛哪個 milestone」+「誰把它當相依」才准說「不屬於」,
  只知一半回 None(閘放行);project_roots() 給主線檔與帳本共用
- scripts/mainline:set --hub <票>、adopt 別 repo ⇒ POST 相依到 hub 票(--via 可指定成員),
  沒 hub 票時擋下並給兩條走得通的路,不建同名里程碑;has 查 /blocks;
  refresh --members 才重收(真 Gitea 25 張要 19 秒,SessionStart 成本不變)
- scripts/ticket:add_dependency() 一份(subtask 與 adopt 共用,409 冪等);pick 主線組走成員清單,
  逾期組一個里程碑物件一組;claim 的主線判定改看相依;pickable(None) 給靠邊進來的票
- hooks/mainline-focus-guard.sh:新鮮查詢問 milestone+/blocks,補收出路明講不要開同名里程碑
- scripts/milestone-account:帳本找家用同一把尺,退回原始碼目錄只在它有 .git(plugin 快取沒有)

測試:新 hooks/tests/mainline-members-by-dependency.test.sh 56 條(假 Gitea 照真的回 201/409);
scripts/test-ticket-pick.sh 48→53 條(池子改用相依邊,補「同名沒邊 ⇒ 不抓」);
既有 mainline-focus-guard/repo-mirror/gitea-fallback/idle/milestone-account/debt-worklist/
handoff-writeback 全綠。真 Gitea 唯讀實跑:set --hub inkstone/InkStoneCo#44 收到 25 張、5 個 repo,
mira#6/ISEP#130/ISEP#140/arcrun-rag#104 都在,不必新增任何邊。

版本:待總管定版(改了會被載入的 hook/scripts)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 10:40:55 +00:00
claude-code ca10e1db30 跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(scripts/milestone-account) 2026-08-28 01:04:16 +00:00