@geoly-ai/skills-hub 0.3.1 → 0.3.2

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.
@@ -19,6 +19,24 @@ process.emit = function (name, data, ...rest) {
19
19
  for (const k of Object.keys(process.env)) {
20
20
  if (k.startsWith('GEOLY_FAULT')) delete process.env[k];
21
21
  }
22
+ // 🔴 认 HTTP_PROXY / HTTPS_PROXY / NO_PROXY —— **必须在第一次 fetch 之前**。
23
+ //
24
+ // Node 的内建 fetch(undici)**默认不认代理环境变量**,而 curl / npm / git 都认。
25
+ // 后果不是「慢一点」:在企业代理后面,`install` 会以 `UND_ERR_CONNECT_TIMEOUT`
26
+ // 直接失败,而同一台机器上 `curl` 同一个地址是通的 —— 于是看起来像我们的
27
+ // registry 挂了。2026-09-03 在开发机上实测到,绕了两圈才找到。
28
+ //
29
+ // ⚠️ `NODE_USE_ENV_PROXY` 是 Node **24** 引入的;22.x 上这一行**无效**,
30
+ // 代理后面的 22.x 用户仍然连不上。这是已知缺口,不要写成已解决。
31
+ //
32
+ // 📌 代理不削弱安全性:HTTPS 走 CONNECT 隧道,TLS 仍是端到端;
33
+ // 而且我们对取回的字节做的是**签名验证**,一个恶意代理改了字节只会验签失败。
34
+ //
35
+ // 🔴 只在**用户没有显式表态**时设置:已经设过(哪怕设成 '0')就尊重用户的选择。
36
+ if (process.env.NODE_USE_ENV_PROXY === undefined) {
37
+ process.env.NODE_USE_ENV_PROXY = '1';
38
+ }
39
+
22
40
  const { lockdown } = await import('../src/fault-inject.mjs');
23
41
  lockdown();
24
42
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geoly-ai/skills-hub",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "geoly-ai 的 skill 分发中心 —— 安装、校验、审计",
5
5
  "type": "module",
6
6
  "bin": {
package/src/download.mjs CHANGED
@@ -171,7 +171,18 @@ export async function download(url, {
171
171
  });
172
172
  } catch (e) {
173
173
  if (ac.signal.aborted) throw new NetworkError(`${what} 下载超时(${timeoutMs} ms)`);
174
- throw new NetworkError(`${what} 下载失败:${e.message}`);
174
+ // 🔴 **必须带上 `e.cause`。** undici 抛的永远是 `TypeError: fetch failed`,
175
+ // 真因(ETIMEDOUT / UND_ERR_CONNECT_TIMEOUT / ENOTFOUND / 证书错误…)
176
+ // 全在 `cause` 里。只报 message 的话用户看到的就是一句
177
+ // 「fetch failed」—— 什么都定位不了。
178
+ // 2026-09-03 我自己被这句话挡了两轮,最后是手写探针才挖出
179
+ // UND_ERR_CONNECT_TIMEOUT,进而发现是代理没被认。
180
+ const why = e.cause?.code ?? e.cause?.message ?? e.code ?? '';
181
+ const hint = /TIMEOUT|ETIMEDOUT|ECONNREFUSED/.test(String(why))
182
+ ? '\n 连不上。若你在代理后面:本 CLI 认 HTTPS_PROXY / NO_PROXY,'
183
+ + '但那需要 Node ≥ 24(当前 ' + process.version + ')。'
184
+ : '';
185
+ throw new NetworkError(`${what} 下载失败:${e.message}${why ? `(${why})` : ''}${hint}`);
175
186
  }
176
187
 
177
188
  if (res.status >= 300 && res.status < 400) {