@dptech-corp/bohr-cli 2.6.92 → 2.6.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -16,6 +16,26 @@
16
16
 
17
17
  ## [Unreleased]
18
18
 
19
+ ## [2.6.93] - 2026-09-10
20
+
21
+ ### Added
22
+
23
+ - 新增 `--payment-source photon|balance`,普通命令与 `bohr api` 均可用;不指定仍先光子后余额,显式渠道不足时提示且不切换扣费来源。
24
+
25
+ - **`bohr extension unpin <name>`**:解掉 `bohr extension pin` 钉下的哈希,恢复该扩展的升级。此前解 pin 只能手改 `~/.bohr/tools/<name>/manifest.yaml` 或整个删掉重装。
26
+
27
+ ### Fixed
28
+
29
+ - **`bohr extension install` 不再留下用不上的 `.bak`**:此前每装一次都把旧二进制改名留在 `~/.bohr/tools/<name>/current/` 下,没有任何东西会读它或清它,一个工具因此长期占双份磁盘(实测 wenyon 29M vs 12M)。
30
+
31
+ - **pin 住的扩展不会再被静默解开**:此前每次升级伴生工具都把 `pinned_hash` 抹成空串,`bohr extension verify` 随之不再检查 pin,而全过程一声不吭。现在升级前先查 pin:发布方给的哈希与 pin 不一致就保留原二进制并说明怎么解,一致时照常安装且 pin 原样保留。
32
+
33
+ ### Changed
34
+
35
+ - **pin 住的扩展不再被升级**(`bohr extension install` 与 npm postinstall 同一口径)。改前:照装、并清掉 pin。改后:不点名时打一行 `Kept <name>: …` 跳过、退出码不变;**点名**装一个 pin 住的工具则报错并非零退出。调用方要恢复升级,先 `bohr extension unpin <name>` 再 install。这包括安全更新。
36
+
37
+
38
+
19
39
  ## [2.6.92] - 2026-09-10
20
40
 
21
41
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dptech-corp/bohr-cli",
3
- "version": "2.6.92",
3
+ "version": "2.6.93",
4
4
  "description": "CLI tool for Bohrium scientific computing platform",
5
5
  "bin": {
6
6
  "bohr": "run.js"
@@ -32,11 +32,11 @@
32
32
  "CHANGELOG.md"
33
33
  ],
34
34
  "optionalDependencies": {
35
- "@dptech-corp/bohr-cli-darwin-arm64": "2.6.92",
36
- "@dptech-corp/bohr-cli-darwin-amd64": "2.6.92",
37
- "@dptech-corp/bohr-cli-linux-amd64": "2.6.92",
38
- "@dptech-corp/bohr-cli-linux-arm64": "2.6.92",
39
- "@dptech-corp/bohr-cli-windows-amd64": "2.6.92",
40
- "@dptech-corp/bohr-cli-windows-arm64": "2.6.92"
35
+ "@dptech-corp/bohr-cli-darwin-arm64": "2.6.93",
36
+ "@dptech-corp/bohr-cli-darwin-amd64": "2.6.93",
37
+ "@dptech-corp/bohr-cli-linux-amd64": "2.6.93",
38
+ "@dptech-corp/bohr-cli-linux-arm64": "2.6.93",
39
+ "@dptech-corp/bohr-cli-windows-amd64": "2.6.93",
40
+ "@dptech-corp/bohr-cli-windows-arm64": "2.6.93"
41
41
  }
42
42
  }
package/postinstall.js CHANGED
@@ -320,6 +320,34 @@ async function installManagedTool({
320
320
  return "rejected-hash";
321
321
  }
322
322
 
323
+ // pin 读一次,下面两条分支共用这一个值。原先复用分支传 readPinnedHash(root)、安装分支
324
+ // 干脆不传(默认 ""),于是每一次升级都把用户 `bohr extension pin` 钉下的哈希写成空串。
325
+ // 后果不是「校验失败」是「校验消失」——Go 侧 IsPinned 看的就是这个字段,它一空,
326
+ // `bohr extension verify` 之后不再输出任何与 pin 有关的东西,用户从任何地方都得不到
327
+ // 「你钉的东西被解开了」这句话。实测:安装前 pinned_hash=fe6e0f55…,返回 installed,
328
+ // 安装后 pinned_hash=""。
329
+ //
330
+ // 口径是「钉住的就不动它,并且说清怎么解」。候选还有「照装但保留 pin,让 verify 下次
331
+ // 报错」和「照装、清 pin、但出声」;选这个是因为 pin 在别处(apt hold、go.mod)本来就
332
+ // 是「别动它」,而 postinstall 跳过一个工具已经是正常结局——拿不到哈希那条走的就是这个。
333
+ //
334
+ // 代价认下来:钉住的人拿不到升级,包括安全更新。所以这句话必须自带出路,`unpin` 子命令
335
+ // 是随本次改动一起加的:在它之前,用户唯一的解法是手改 manifest.yaml 或者把整个扩展删掉
336
+ // 重装。指着一个不存在的命令说「先去 unpin」,比不说更糟。
337
+ //
338
+ // 只在**要装的东西与 pin 不一致**时拦。pin 恰好等于发布方当前哈希时照常往下走:那时装
339
+ // 进去的字节就是用户钉的那些,拦下来反而让「钉了、但文件被删了」的人再也装不回去。
340
+ const pinnedHash = readPinnedHash(root);
341
+ const pinned = String(pinnedHash == null ? "" : pinnedHash).trim().toLowerCase();
342
+ if (pinned && pinned !== wanted) {
343
+ notify(
344
+ `[postinstall] ${label}: pinned to ${pinned.slice(0, 12)}… by \`bohr extension pin\`, ` +
345
+ `publisher now offers ${wanted.slice(0, 12)}… — keeping the pin, not upgrading\n` +
346
+ `[postinstall] to take the upgrade: bohr extension unpin ${name} && bohr extension install ${name}`
347
+ );
348
+ return "pinned";
349
+ }
350
+
323
351
  const destPath = path.join(installDir, executable);
324
352
 
325
353
  // 已装的那个,**只按哈希判**。哈希取自发布方,不取自本地文件——本地文件不能自证。
@@ -342,7 +370,7 @@ async function installManagedTool({
342
370
  version,
343
371
  executable,
344
372
  sha256: localHash,
345
- pinnedHash: readPinnedHash(root),
373
+ pinnedHash,
346
374
  });
347
375
  console.log(`[postinstall] ${label} ${version || ""} already installed`);
348
376
  return "reused";
@@ -381,7 +409,7 @@ async function installManagedTool({
381
409
  }
382
410
  fs.chmodSync(tmpPath, 0o755);
383
411
  fs.renameSync(tmpPath, destPath);
384
- writeManagedManifest(root, { name, version, executable, sha256: actualHash });
412
+ writeManagedManifest(root, { name, version, executable, sha256: actualHash, pinnedHash });
385
413
  console.log(`[postinstall] ${label} ${version || ""} installed to ${destPath}`);
386
414
  return "installed";
387
415
  } catch (e) {