@dptech-corp/bohr-cli 2.6.93-preview.1864 → 2.6.94

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,12 +16,41 @@
16
16
 
17
17
  ## [Unreleased]
18
18
 
19
+ ## [2.6.94] - 2026-09-10
20
+
21
+ ### Added
22
+
23
+ - **`bohr extension install` 有了机读回执**:`-o json` 下 stdout 给一份信封,逐个列出工具的名称、动作(installed/kept)、版本、安装路径与哈希。此前 stdout 一个字节都没有。进度仍在 stderr,人类输出不变。
24
+
25
+ - **CHANGELOG 已发布小节多出一行会被门禁挡住了**:此前只查「上一版条目有没有丢」、不查「有没有多」,新条目被 rebase 静默填进已发布的小节时全绿,到下一次发版就被逐字保护永久冻死。本条不含 CLI 行为面改动。
26
+
27
+ ### Fixed
28
+
29
+ - **`bohr extension install` 拿不到可用 SHA256 就拒装**(与 npm 安装同一口径):此前少给哈希会跳过校验、假二进制照装还返回成功,trisol 空校验文件更会 panic。空/空白/HTML/截断/缺字段五种都在下载前拒。代价:发布方不给哈希时安装会失败。
30
+
31
+ - **扩展下载不再撞 60 秒总时限**:此前元数据请求与二进制下载共用一个 60 秒预算,而 Go 的 Timeout 是含读完响应体的总时限,等于在赌带宽——14MB 的 wenyon-cli 实测一趟 82 秒。下载现在有自己的预算。
32
+
33
+ - **续期不再因 issuer 少一个尾斜杠打错地址**:登录态里存的 issuer 不带尾斜杠时,token 续期会打到 `<issuer>token`,报成瞬时故障、重试永远不会成功。现在带不带斜杠都打到 `<issuer>/token`。
34
+
35
+ ## [2.6.93] - 2026-09-10
36
+
19
37
  ### Added
20
38
 
21
- - **Widget 开发与上传**:`agents dev widgets` 支持创建项目、离线校验、打包、上传 ZIP 和查询检查;内置指引见 `skills read widget`。
22
- - **Widget 文件与运行态**:新增 file-preview 和 workspace-files panel 脚手架,分段读取、缺权限展示、取消与销毁;内置事件订阅和动作幂等说明,固定 contracts alpha.2 / SDK alpha.1。
23
- - **Widget 发布与绑定**:新增受预期 digest 保护的版本发布、带草稿 revision Agent 完整绑定读写、owner 样例预览深链与 `--open`。
24
- - **Widget 资源闭环**:新增资源/可选版本查询、发布检查、精确版本查询、上传会话 commit 和样例预览准备;校验服务端 `sha256:` 摘要格式,拒绝缺失或错配的成功回执。预览准备不代表浏览器渲染通过。
39
+ - 新增 `--payment-source photon|balance`,普通命令与 `bohr api` 均可用;不指定仍先光子后余额,显式渠道不足时提示且不切换扣费来源。
40
+
41
+ - **`bohr extension unpin <name>`**:解掉 `bohr extension pin` 钉下的哈希,恢复该扩展的升级。此前解 pin 只能手改 `~/.bohr/tools/<name>/manifest.yaml` 或整个删掉重装。
42
+
43
+ ### Fixed
44
+
45
+ - **`bohr extension install` 不再留下用不上的 `.bak`**:此前每装一次都把旧二进制改名留在 `~/.bohr/tools/<name>/current/` 下,没有任何东西会读它或清它,一个工具因此长期占双份磁盘(实测 wenyon 29M vs 12M)。
46
+
47
+ - **pin 住的扩展不会再被静默解开**:此前每次升级伴生工具都把 `pinned_hash` 抹成空串,`bohr extension verify` 随之不再检查 pin,而全过程一声不吭。现在升级前先查 pin:发布方给的哈希与 pin 不一致就保留原二进制并说明怎么解,一致时照常安装且 pin 原样保留。
48
+
49
+ ### Changed
50
+
51
+ - **pin 住的扩展不再被升级**(`bohr extension install` 与 npm postinstall 同一口径)。改前:照装、并清掉 pin。改后:不点名时打一行 `Kept <name>: …` 跳过、退出码不变;**点名**装一个 pin 住的工具则报错并非零退出。调用方要恢复升级,先 `bohr extension unpin <name>` 再 install。这包括安全更新。
52
+
53
+
25
54
 
26
55
  ## [2.6.92] - 2026-09-10
27
56
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dptech-corp/bohr-cli",
3
- "version": "2.6.93-preview.1864",
3
+ "version": "2.6.94",
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-amd64": "2.6.93-preview.1864",
36
- "@dptech-corp/bohr-cli-darwin-arm64": "2.6.93-preview.1864",
37
- "@dptech-corp/bohr-cli-linux-amd64": "2.6.93-preview.1864",
38
- "@dptech-corp/bohr-cli-linux-arm64": "2.6.93-preview.1864",
39
- "@dptech-corp/bohr-cli-windows-amd64": "2.6.93-preview.1864",
40
- "@dptech-corp/bohr-cli-windows-arm64": "2.6.93-preview.1864"
35
+ "@dptech-corp/bohr-cli-darwin-arm64": "2.6.94",
36
+ "@dptech-corp/bohr-cli-darwin-amd64": "2.6.94",
37
+ "@dptech-corp/bohr-cli-linux-amd64": "2.6.94",
38
+ "@dptech-corp/bohr-cli-linux-arm64": "2.6.94",
39
+ "@dptech-corp/bohr-cli-windows-amd64": "2.6.94",
40
+ "@dptech-corp/bohr-cli-windows-arm64": "2.6.94"
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) {