把「該用哪些資源」搬出 CLI——一份實作,acr 與安裝器吃同一條規則 #111
Reference in New Issue
Block a user
Delete Branch "fix/adopt-rule-shared"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
「這個實例該用哪些資源」換到安裝器就要重寫一次 ⇒ 依
.claude/rules/07-thin-shell.md的判準口訣,它是能力;而它原本住在
cli/src/lib/resource-resolver.ts(431 行)⇒ 那本身就是違規。後果已經真的發生:
acr那條有Arcrun#97的修法、安裝器那條沒有 ⇒「我按了更新,工作流和登入全不見了」。CLI 淨 -496 行(邏輯是搬走,不是複製)。
① 規則放在哪、為什麼(含自舉怎麼解)
shared/resource-rule/—— 零依賴 ESM,Node 18+ 與 Cloudflare Workers runtime 都能直接 import。rule.mjsplanResources/applyResourcePlan/parseWranglerRequirements)+把 CF 回應讀成事實的normalizeLiveBindings/normalizeLiveVarscf-resource-api.mjsResourceApi的 CF REST 實作(只用 globalfetch)installer-entry.mjsresolveInstanceResources()為什麼不是 cypher-executor 的 API 端點(=自舉那一題)
薄殼原則的標準答案是「能力放 API」,這一條刻意不走,理由有三,都不是形式問題:
正是把 cypher 生出來 —— 放進 cypher 等於要先有雞才能有蛋。
(a)「能不能安裝」從此綁在平台是否活著,(b) 使用者的 CF 帳號拓撲交給第三方。兩件都不該做。
ResourceApi)。薄殼原則要求的是「能力只實作一次」,不是「能力一定要是 HTTP」。
其他評估過的形態:共用 npm 套件 → 要多發一個 package + token,且安裝器得先
npm i才能判斷,自舉問題只是換個位置;做成一顆零件 → 得用 TinyGo/AssemblyScript 重寫一次,那正是本票要消滅的東西。
順帶:連 CF client 也共用
判斷一致還不夠,看到的東西也要一致。「已部署的 worker 綁著什麼」是從
GET /workers/scripts/{script}/settings讀來的;兩條路各自寫一份 client,只要有一邊把404 當錯誤、漏了
per_page、少認一種欄位名(namespace_idvsid),那一邊就會「看不到既有綁定」—— 而看不到既有綁定的下一步,依規則就是新建。
#97 不需要規則寫錯,眼睛不一樣就足以重演。
所以
CfAccountClient的ResourceApi七個方法全部委派共用 client,自己不留實作。② 「只有一份」怎麼證明
(
rules/05-deploy-convention.md「WASM 來源」),shared/resource-rule/就在那份 archive 裡,直接 import。acr需要一份鏡射:arcrun是獨立 npm 套件,npm pack打不進套件目錄外的檔案。cli/src/lib/resource-rule/是逐位元組鏡射,由scripts/sync-resource-rule.mjs產生——同
cli/harness/(產生物進 repo +check:harness世代閘)的既有慣例,不是為本票新發明的做法。cli/tests/single-implementation.test.ts把 leo 要求的那個 grep 寫成了會紅的東西:閘是真的會擋——實測手改鏡射一行後跑
npm test:npm run build與npm test都先跑這道閘 ⇒ 漂移擋在 build 與 npm publish 之前。③ 兩條路一致性的 fixture 對照
shared/resource-rule/tests/fixture-account.mjs造一個假帳號,假的是fetch不是ResourceApi——所以兩條路都真的走完 HTTP → 解析 → 判斷整條鏈(只假
ResourceApi會跳過「怎麼把 CF 回應讀成事實」,而那正是 #97 能重演的地方)。同一份帳號狀態餵給:
acr那條:CfAccountClient+resource-resolver(CLI 真正跑的 import 鏈)shared/resource-rule/installer-entry.mjscli/tests/two-paths-agree.test.ts實跑輸出:除了 resource id,還斷言建了什麼與停手的理由也一樣
(「一邊停手、一邊照做」是最危險的分歧)。
④ 三種情境的實測
情境③ 的資源名(
kv-51mggz之類)刻意取成跟 binding 名毫無關聯的雜湊字串——只要規則裡還有一絲「照名字對號」就會在這裡露餡。
安裝器那條路也能零依賴、零建置獨立跑(
node shared/resource-rule/tests/demo.mjs),這本身就是「安裝器把 repo archive 拉下來就能直接用」的證據:
(末欄順帶證明
Arcrun#106的plain_textvar 沿用也走同一條路。)全套驗證
58 = 原本 49(全數保留通過,含
resource-adoption.test.ts的 #97 迴歸)+ 本次新增 9。npm 打包確認產生物真的出得去:
npm pack --dry-run | grep -c resource-rule→16;dist/lib/resource-rule/*.mjs就位,載入後ResourceApi七個方法齊全。◐ 沒做到的一件事(誠實標)
「在 youlin 上走安裝器那條路更新一次」沒有跑成。 兩個原因,都不是選擇性略過:
products/arcrun-rag/installer/oauth-prototype/worker.js屬於arcrun-rag,本工作副本裡不存在(find全無命中)。派工單也說明本票不做移交(另票)。.env、沙箱讀不到~/.arcrun/),連唯讀查 youlin 帳號都做不到。
所以本 PR 交付的是「規則側」:安裝器需要改的是一行 import(見
shared/resource-rule/README.md§4 的完整片段),而不是抄一份邏輯過去。接手
arcrun-rag那張票時:在 youlin 上做更新前後 resource id 對照,應該是那張票的驗收
(依紅線「不確定時寧可中止」,我沒有在拿不到帳號的情況下猜著跑)。
另一件被擋下的
想在
.claude/rules/07-thin-shell.md§1 補一段「自舉例外」的正例(讓下一個人不會又把它寫回介面層),但該檔是受保護檔案、本 session 改不動。內容已完整寫在
shared/resource-rule/README.md§2,要的話可由總管代補。
📍
Arcrun#97(CLI 已修,本票是把同一條規則交給所有路徑)|Arcrun#106(liveVars)|Arcrun#80/arcrun-rag#39(同一個「重複做 Arcrun 的工作」家族)|.claude/rules/07-thin-shell.md(依據)leo 2026-08-12:「根本就不應該在 CLI,我要的是一個大家都可以用到的規則。」 「這個實例該用哪些資源」換到安裝器就要重寫一次 ⇒ 依 rules/07-thin-shell.md 的判準 它是**能力**,而它原本住在 cli/src/lib/resource-resolver.ts ⇒ 那本身就是違規。 後果已經真的發生:acr 那條有 Arcrun#97 的修法、安裝器那條沒有,於是安裝器照名字 找、找不到就建一顆空的綁上去 ⇒「我按了更新,工作流和登入全不見了」。 規則搬到 shared/resource-rule/(零依賴 ESM,Node 與 Workers runtime 都直接跑): · rule.mjs 規則本體+把 CF 回應讀成事實的 normalizeLive* · cf-resource-api.mjs ResourceApi 的 CF REST 實作——**眼睛也共用**: 兩條路各自解讀 CF 回應,只要一邊看不到既有綁定就會去新建, #97 不需要規則寫錯就能重演 · installer-entry.mjs 安裝器唯一該碰的入口 resolveInstanceResources() 不是做成 cypher 端點的理由(自舉):這條規則要在「決定怎麼裝」的當下就用得到, 而那時 cypher 可能還不存在(安裝器的工作正是把它生出來);且輸入是使用者自己帳號的 綁定狀態,不該送去平台換答案。它是純函式,用不著變成服務。 只有一份,機械看守: · 安裝器直接 import repo archive 裡的原稿,**不需要副本** · acr 因為 npm pack 打不進套件目錄外的檔案,帶一份逐位元組鏡射 (scripts/sync-resource-rule.mjs 產生;build/test 先跑 --check,差一位元組就紅) ——同 cli/harness/ 產生物+世代閘的既有慣例 · cli/tests/single-implementation.test.ts 掃全 repo:7 支規則函式的實作只有一處 CLI 淨 -496 行(邏輯是搬走,不是複製)。cf-api.ts 的 CfAccountClient 保留公開介面, ResourceApi 那七個方法全部委派共用 client。 驗證:cli 58/58 綠(含新增的兩條路一致性 fixture + 三種情境),tsc --noEmit 乾淨。