Skip to content

[feature] pb manifest:不含祕密的機器清單,可以進版控 - #24

Merged
YJack0000 merged 2 commits into
mainfrom
feature/pb-manifest
Aug 28, 2026
Merged

[feature] pb manifest:不含祕密的機器清單,可以進版控#24
YJack0000 merged 2 commits into
mainfrom
feature/pb-manifest

Conversation

@YJack0000

Copy link
Copy Markdown
Contributor

為什麼

manifest.json 一直是對的東西:無祕密、pb plan --manifest 吃得下、schema 穩定。問題是它只存在於加密 bundle 內部。要拿到那份安全、可以進版控的清單,你得先產出「這台機器所有憑證打包在一起」的那個危險檔案,再解開它。

這讓一個很常見的需求做不到:我不想搬憑證,我只想留下「我在用什麼」的紀錄,然後在新機器上讓 AI 看著它把 CLI 裝一裝、叫我逐一登入。

做了什麼

pb manifest                          # stdout
pb manifest -o setup/manifest.json   # 寫檔,然後 commit 它
  • 不開任何憑證檔。 這不是效能優化——為了產出一個不含任何憑證的檔案而去讀遍機器上每一把憑證,正是這個指令存在的理由。
  • vault 只列不解鎖;MCP 記變數名稱不記值;carried 一律為空。
  • 新增 kind 欄位(inventory / bundle),#[serde(default)]bundle 所以舊檔照讀。宣稱東西搬過去了卻其實沒有,是這個格式唯一不能說的謊。
  • 新增 write_manifest MCP tool:機器搬遷裡唯一能讓 agent 自己做的一步,因為它不碰憑證。export / import 仍留在 CLI,跟人與密語在一起。
pb export pb manifest
憑證檔 複製進 bundle 從不開啟
vault 祕密值 只有 --keys 才帶 從不
MCP env/header 值 只有名稱
加密 是,要密語 否,沒有東西需要加密
可以進版控
拒絕寫進雲端同步資料夾 否,那正是它該在的地方

順手修掉的 bug

collect_mcp 只要 spec 讀得到就標 carried: true。在 bundle 情境下剛好成立,在不搬值的情境下是錯的。既有的 export 沒受影響(兩者恰好重合),是做 inventory 這條路時發現的。

驗證

  • cargo test754 passed, 0 failedcargo clippy --all-targets 零警告
  • 新增 test_an_inventory_manifest_carries_nothing_and_says_so:用一台同時有可攜憑證檔、keychain 綁定工具、以及 env 裡含祕密的 MCP 註冊的假 home,斷言 inventory 什麼都沒帶、但仍列得出東西,且 GRAFANA_TOKEN 這個名稱在檔案裡、glsa_secret 這個不在
  • 在這台真實機器上跑過:18 個 CLI、57 把 key、14 個 MCP 註冊,實際 grep 過已知的 developer token / OAuth client secret / refresh token,一個都沒出現

一個要相處的事實

key 的 purpose 是自由文字,會原封不動進到這個「可以進版控」的檔案。patchbay 自己絕不會把祕密寫在那裡,但人可以。README、docs 與 MCP tool description 三處都寫明了這件事,建議第一次 commit 前掃一眼那個欄位。

manifest.json 本來就是「無祕密、可被 pb plan --manifest 消費」的那一半,
但它只存在於加密 bundle 內部——要拿到安全的那半,得先產出危險的那半再解開。

pb manifest 直接把它單獨寫出來(stdout 或 -o <file>):
- 不開任何憑證檔。這不是效能考量,而是這個指令存在的理由:為了產出
  一個不含任何憑證的檔案而去讀遍機器上每一把憑證,正是它要避免的事
- vault 只列不解鎖;MCP 只記變數名稱不記值;carried 一律為空
- 新增 kind 欄位(inventory / bundle,預設 bundle 以相容舊檔)——
  宣稱東西搬過去了卻其實沒有,是這個格式唯一不能說的謊

順手修掉 collect_mcp 的不誠實:只要 spec 讀得到就標 carried=true,
在 bundle 情境下剛好成立,在不搬值的情境下是錯的。

另加 write_manifest MCP tool:機器搬遷裡唯一能讓 agent 自己做的一步,
因為它不碰任何憑證。export / import 仍留在 CLI,跟人與密語在一起。
@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown

✅ SonarQube Quality Gate passed — pathorsAI_patchbay

0 open issues on this PR.

- 版號回到 0.5.0、CHANGELOG 改回 [Unreleased]。這個 repo 的慣例是功能 PR
  只寫 Unreleased,版號由獨立的 [chore] release 一次改六處;我在功能 PR 裡
  bump 反而讓 app/src-tauri/Cargo.lock 對不上,panel 的 --locked clippy 掛掉

- Sonar: build 的 cognitive complexity 39 > 15。把每個工具那一圈抽成
  tool_record(),檔案複製再抽成 carry_tool_files()。改名 payload→build 讓
  整段被當成新程式碼是觸發點,但這函式本來就太長了
@YJack0000
YJack0000 merged commit 7a57a7d into main Aug 28, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant