glasspane-install 1.4.0 → 1.6.0

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.
Files changed (2) hide show
  1. package/cli.js +42 -3
  2. package/package.json +1 -1
package/cli.js CHANGED
@@ -69,7 +69,7 @@ export const INSTALL_SH_URL =
69
69
  /** 发布线锚点(版本真源 = 根 package.json,由 scripts/set-version.mjs 统一改写,
70
70
  * 勿手改):npx 形态下本地没有仓库时,引导 clone 的就是这个 tag,与 install.sh
71
71
  * 的 `GLASSPANE_RELEASE` 同值——两条一键入口必须拿到同一份源码。 */
72
- export const RELEASE_VERSION = '1.4.0'
72
+ export const RELEASE_VERSION = '1.6.0'
73
73
  /** 发布 ref(tag 名)。GLASSPANE_REF 环境变量可覆盖(追主干用 `main`)。 */
74
74
  export const REPO_REF = `v${RELEASE_VERSION}`
75
75
 
@@ -849,6 +849,9 @@ export async function registerAutoUpdate({
849
849
  now = new Date(),
850
850
  exists = fs.existsSync,
851
851
  say = (line) => printStep(line),
852
+ // §9:注册那一趟现在会导出系统根证书束并起子进程探测一次 release 端点。
853
+ // 单测必须能替换掉这两件事——否则 `npm test` 变成一次联网测试,慢且不稳。
854
+ updaterDeps = {},
852
855
  } = {}) {
853
856
  const tree = updaterTreePaths(rootDir)
854
857
  const modules = {}
@@ -894,7 +897,7 @@ export async function registerAutoUpdate({
894
897
  }
895
898
 
896
899
  const flags = { json: false, auto: false, help: false, consents: [], overrides: {}, 'state-dir': stateRoot }
897
- const deps = { cliPath: tree.cli, ...homeArgs }
900
+ const deps = { cliPath: tree.cli, ...homeArgs, ...updaterDeps }
898
901
  if (uid !== null && uid !== undefined) deps.uid = String(uid)
899
902
  if (runLaunchctl) deps.runLaunchctl = runLaunchctl
900
903
 
@@ -930,9 +933,37 @@ export async function registerAutoUpdate({
930
933
  pointer: written.pointer,
931
934
  pointerPath: written.path,
932
935
  message: outcome.message,
936
+ // updater 有没有把在册作业读回来核对过。`false` 不是失败(作业确实装载了),但也确实没人证明
937
+ // launchd 手里的是这一份;安装日志要说的是这两者之中的那一个,而不是"已注册"三个字。
938
+ agentVerified: outcome.agentVerified ?? null,
939
+ // `undefined`(这份 updater 根本不回报)与 `null`(回报了但没有束)对读者是同一句话:
940
+ // 没有证据。合成一个形状,下游就不必为两种"没有"各写一条分支——而两种分支里,
941
+ // 漏掉一种就是崩溃。
942
+ caRoots: outcome.state && outcome.state.caRoots ? outcome.state.caRoots : null,
933
943
  }
934
944
  if (registered) {
935
945
  say(`每日自动更新已注册(${agentLabel},默认 ${schedule},状态根 ${stateRoot};指针 ${written.path})——一键关:node "${tree.cli}" disable`)
946
+ // "已注册"这三个字的证据是 updater 把在册作业读回来核对过。launchd 装载成功但读不回在册作业时,
947
+ // 这句话只能算一半成立,而那另一半(原话)必须跟着说出来——否则这台机器看起来有每日作业,实际
948
+ // 有没有人跑没人知道。措辞仍来自唯一作者 outcome.message,这里只转述。
949
+ //
950
+ // 只此一处:`summary.agentVerified` 就是 `outcome.agentVerified` 的副本,两处判断同一个值就会
951
+ // 打两行近乎相同的告警,而"两行"在这种机器上读起来像两件不同的事出了问题。
952
+ if (summary.agentVerified === false) {
953
+ say(paint(`注意(每日作业还没被核对过):${outcome.message}`, 'yellow'))
954
+ say(' 这一步只说明 launchd 接受了装载;这条命令之后有没有真的成为在册作业,上面的原话里说了为什么读不出来。')
955
+ }
956
+ // §9.8:node 不读 macOS 信任库,装了 HTTPS 中间人的机器上这件事只有 updater 自己能发现。
957
+ // 安装日志必须把它说出来——否则每天失败的是一个看起来在正常工作的代理。措辞与 remedy
958
+ // 都来自 outcome.message(唯一作者),这里只转述,不重写。
959
+ const ca = summary.caRoots
960
+ if (ca && ca.status === 'ok') {
961
+ say(`node 的系统根证书束:已导出 ${ca.certs} 张 → ${ca.path},并已写进该作业的 NODE_EXTRA_CA_CERTS`)
962
+ } else if (ca) {
963
+ say(paint(`注意(自动更新的网络这一跳):${outcome.message}`, 'yellow'))
964
+ } else {
965
+ say(paint(`注意:这份 updater 没有回报根证书束的导出结果(旧版本);若本机 HTTPS 被中间人替换,每日检查会在第一道校验上失败,跑 node "${tree.cli}" enable 可重新导出。`, 'yellow'))
966
+ }
936
967
  } else {
937
968
  say(
938
969
  `自动更新已关闭(${switchedOffByEnv ? 'updater 报环境变量已关,见下面它自己的原话' : '--no-auto-update'}):`
@@ -960,10 +991,18 @@ export function updateGuidanceText(update) {
960
991
  ]
961
992
  }
962
993
  if (update.state === 'registered') {
994
+ const ca = update.caRoots
995
+ const caLine = !ca
996
+ ? ` ⚠ 这份 updater 没有回报 node 要用的系统根证书束(旧版本);本机 HTTPS 若被中间人替换,每日检查会在第一道校验上失败。补上:node "${update.updaterCli}" enable。`
997
+ : ca.status === 'ok'
998
+ ? ` node 用本机导出的系统根证书束 ${ca.certs} 张(${ca.path},已写进作业的 NODE_EXTRA_CA_CERTS)。`
999
+ : ` ⚠ 本机没能导出 node 要用的系统根证书束(${ca.status});HTTPS 被中间人替换的机器上,每日检查会在第一道校验上失败,`
1000
+ + '面板与 gp_diagnose 会一直显示这句话,修复办法是它给的那条。'
963
1001
  return [
964
1002
  `6. 自动更新:默认开。launchd 每日 ${update.schedule} 跑 "${update.updaterCli}" check && apply`,
965
1003
  ` (作业 ${update.agentLabel},RunAtLoad=false,日志 ${update.stateRoot}/update.log);`,
966
- ' 只在 daemon 空闲应答探针、且规格 §1 七道校验全过时才换版,major 永远等人点按钮。',
1004
+ ' 只在 daemon 空闲应答探针、且规格 §1 八道校验全过时才换版,major 永远等人点按钮。',
1005
+ ...(caLine ? [caLine] : []),
967
1006
  ` 一键关:node "${update.updaterCli}" disable(卸该作业 + 状态记 disabled=true);重开:enable。`,
968
1007
  ` 卸载本机安装时:bootout daemon 作业的同时**也必须** bootout ${update.agentLabel} 并删它的 plist。`,
969
1008
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glasspane-install",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "GlassPane one-command installer: terminal onboarding → install deps → build TS + Swift engine → start daemon → open settings GUI for permission guide",
5
5
  "type": "module",
6
6
  "license": "MIT",