Windows 从 0 开始

给从没装过 KernelHub 的 Windows 电脑。照着做,每一步都能复制、都知道成功长什么样:先装 Node,再一行装 KernelHub,登录 Runtime,配对手机,发一条真任务,看它交付。

这一页怎么用
从上往下,一步一步做。每一步都写了:打开哪里、复制哪一行、看到什么算成功、没看到怎么办。命令块右边有「复制」按钮,点一下粘进 PowerShell 回车即可。网络正常就走第 1、2 节的线上安装(推荐);网络被堵看第 5 节;完全断网才用第 4 节的离线整包。

1 · 开始之前:这台电脑缺什么

一台从没装过 KernelHub 的 Windows 10 / 11,要走到「手机上派活、这台电脑上干活」。先搞清楚它自带什么、缺什么:

东西全新 Windows 有没有说明
Windows 10 / 11x64 与 ARM64 都有正式包,安装脚本自己认架构。
PowerShell系统自带 Windows PowerShell 5.1,本页命令都按它写。
curl.exe / tar / certutilWindows 10 1803 起自带,本页的下载与校验会用到。
Node.js / npm没有本页最要紧的一条。安装脚本不会替你装 Node。没有 npm,它就装不上 AI 编码工具(Runtime),结果是「KernelHub 装好了,一个任务都跑不了」。
一个登录过的 Runtime没有KernelHub 不带模型,它驱动的是你自己装好、自己登录过的 CLI 编码 Agent(默认装 Claude Code)。装上 ≠ 能用,没登录照样跑不了任务。
一部手机装好 KernelHub App,用来扫码配对、发任务、批准。
三条铁律(照这个顺序做,能省掉大部分返工)
  1. 先装 Node,再装 KernelHub。顺序反了,装完开不了工(反了也能救:装好 Node 后把安装命令再跑一遍)。
  2. 装完让 Runtime 登录一次(敲 claude,按提示登录)。不登录,任务一律回「本机一家都跑不了」。
  3. 配对之后要让 icloser run 一直开着(或者装成常驻)。配对只是把手机和这台电脑认识一下,真正去接活的是 icloser run

怎么打开 PowerShell

按键盘上的 Win + R,输入 powershell,回车。弹出蓝色(或黑色)窗口就对了。本页只有两处要「以管理员身份运行」,到了会单独说。

2 · 能上网:最短主路径(推荐,共 13 步)

网络正常就走这一节。线上安装拿到的永远是正式清单里的那一版,步骤少、校验自动、后面升级也是同一条命令。第 4 节的离线整包是兜底:给完全断网、内网只准用本地包的机器用,步骤多出十几条,而且它只解决「装」,配对与派任务仍然要有一条能到控制面的通路。

一步一行,复制即用。遇到被堵、没网,跳到对应小节。

你的情况症状看哪里
能上网就是本节,从第 1 步做到第 13 步
icloser.xyz 连不上第 5 步 irm 卡住、超时第 5 节 · 代理 / 换下载源;或第 4 节离线包
registry.npmjs.org 连不上npm install -g 卡住 / ECONNRESET第 5 节 · npm 换镜像
nodejs.org / github.com 连不上下不来 Node 或工具第 5 节 · 代理;或第 4 节离线包
完全断网什么都下不来第 4 节离线包,并一定读完那一节的三条限制

第 1 步 · 看看这台电脑有没有 Node

PS> node -v; npm -v

成功长这样:打出两行版本号(比如 v24.21.0 和一串 npm 版本)—— 说明已经装过 Node,直接跳到第 4 步

全新电脑上会看到:一段红字,里面有「无法将“node”项识别为 cmdlet」(英文系统是 “is not recognized as the name of a cmdlet”)—— 说明没装,做第 2 步。

第 2 步 · 装 Node.js(它自带 npm)

两条路选一条。当前 LTS 版本是 Node v24.21.0(取自 nodejs.org 官方版本清单)。

路 A:一条命令(需要 winget,Windows 11 和较新的 Windows 10 都有)

PS> winget install --id OpenJS.NodeJS.LTS --accept-source-agreements --accept-package-agreements

中途可能弹「是否允许此应用对你的设备进行更改」,点。winget 源里的版本号可能比 nodejs.org 慢几个小版本,不影响使用。

路 B:不依赖 winget —— 指定版本,下载后先核官方 SHA-256,对不上就停

PS> $v='v24.21.0'; $h='bb0eaee134f9357f22aea915ee793343e627aefc1e66488164bac6915bce2cac'; $f="$env:TEMP\node-$v-x64.msi"; curl.exe -L -o $f "https://nodejs.org/dist/$v/node-$v-x64.msi"; if(((certutil -hashfile $f SHA256 | Select-Object -Index 1).Trim() -replace ' ','').ToLower() -ne $h){ throw 'SHA-256 不一致,已中止,未安装' } else { msiexec /i $f }

核对通过才会弹出 Node 安装向导,一路「下一步」即可(同样可能弹管理员确认,点)。想静默安装,把结尾的 msiexec /i $f 换成 msiexec /i $f /qn

那串 bb0eaee1… 是 nodejs.org 官方 SHASUMS256.txtnode-v24.21.0-x64.msi 那一行的值,本站写页面时逐字核过。看到红字 “SHA-256 不一致,已中止,未安装”:说明下载坏了或被换了,重跑一次;还不行就换路 A 或走第 5 节的代理。

第 3 步 · 关掉 PowerShell,重新打开一个

Node 装完之后,老窗口不认识新装的 node。关掉,按第 1 节的办法重开一个,再跑一次:

PS> node -v; npm -v

成功:两行版本号。还是红字:注销或重启一次电脑再试。

第 4 步 · 一行装 KernelHub

PS> irm https://icloser.xyz/install.ps1 | iex

它按顺序做这些事,你不用管,看着就行:

它做什么说明
读发布清单从 kernelhub.icloser.xyz 读 stable.json;清单不是 READY 就拒装,没有强制开关。(脚本本身挂在 icloser.xyz,是两台主机。)
下载并核对icloser.exe,核 SHA-256 与字节数,对不上就删掉并停下。
装到哪%LOCALAPPDATA%\Programs\icloser\icloser.exe,另建三个旧名 icli / kernelhub-cli / devnexus-cli
写 PATH写进用户级 PATH 和当前窗口,不碰系统级 PATH,不需要管理员。
核入口新开终端会有的 PATH 与 PATHEXT,核你敲 icloser / icli 实际会拿到哪一个文件。不是刚装的这一份,就把按顺序命中的全部路径、「你敲它会拿到谁」和三条办法打出来;不改你的 PATH,不删别的工具,也不拒装
自证当场跑 icloser version,和清单里的版本、构建号比对。
本机管理台顺带下 kernelhub-desktop.exe;下失败不影响 CLI。
装一家 Runtimenpm install -g @anthropic-ai/claude-code(默认只装 claude 这一家)。

成功时屏幕上会出现这几行(install.ps1 源码里写死的原句,不是 Windows 真机实录;v 开头是绿色):

v SHA-256 verified
v Installed to C:\Users\<you>\AppData\Local\Programs\icloser\icloser.exe
v Aliases: icli (short name), kernelhub-cli / devnexus-cli (legacy, still work)
v Added C:\Users\<you>\AppData\Local\Programs\icloser to your user PATH
v Typing icloser / icli gets you this install (checked against a new terminal's PATH and PATHEXT)
v icloser 1.0.2 (build 202609161352, commit a4099c062543)
Installing runtime claude (npm install -g @anthropic-ai/claude-code) ...
v Installed runtime: claude (@anthropic-ai/claude-code)

如果看到下面这两行,说明第 2 步没做或没生效 —— KernelHub 本体已经装好,只是没装上 Runtime。回到第 2、3 步装好 Node,再把这一步的命令跑一遍(install.ps1 源码里的原句,不是 Windows 真机实录):

  ! No npm on this machine, so no runtime was installed (KernelHub itself is installed)
     Install Node.js (it ships npm), then run this installer again.

第 5 步 · 核一下装到的是哪一版

PS> icloser version

成功:一行里同时有 1.0.2202609161352(这一行的样子在 Windows 真机上核过):

icloser 1.0.2 (build 202609161352, commit a4099c062543)

报「无法将“icloser”项识别为 cmdlet」:关掉窗口重开一个再试;还不行,把第 4 步再跑一遍。

打出来的不是这一版,或者干脆是别的工具的帮助菜单
说明你敲的 icloser 被 PATH 上排在前面的同名东西抢走了。真机上遇到过两种:
  • npm 全局装过一个也叫 iCloser 的工具…\npm\iCloser.ps1 / .cmd)。
  • 装过旧的 MSIC:\Program Files\KernelHub\bin)。Windows 先查系统级 PATH 再查用户级 PATH,所以它总是排在刚装的这一份前面。
PowerShell 按 PATH 的目录顺序一个目录一个目录找;同一个目录里 .ps1 先于 .exe / .cmd,与 PATHEXT 里写没写 .PS1 无关(2026-09-16 Windows 真机坐实)。
最省事:改用 icli,它是安装脚本同时建的短名,指向刚装的这一份:
PS> icli version
想看清是谁抢了名字(按 PowerShell 实际的先后顺序列出全部):
PS> Get-Command -All icloser
想让 icloser 这个名字也回到这一份:旧 MSI 在「设置 → 应用 → KernelHub → 卸载」里卸掉;npm 装的那个用 npm ls -g 找到包名再 npm rm -g。第 4 步安装脚本在屏幕上印的那段黄字,写的就是这台机器上的具体路径和这几条办法。

第 6 步 · 让 Runtime 登录一次

PS> claude

第一次运行会带你登录(通常会打开浏览器)。按屏幕提示登录完,看到能对话的界面后,输入 /exit 或按 Ctrl + C 两次退出。

然后看看这台电脑认出了哪几家、登没登录:

PS> icloser runtimes

成功:Claude Code 那一行不再是「未安装」,状态里没有 NOT_INSTALLED。还卡在登录态上时,状态会写成 STARTABLE_NOT_AUTHED 或「状态不明」(STARTABLE_AUTH_UNKNOWN)—— 回去再登录一次。

第 7 步 · 进到你的项目目录

把下面的 D:\你的项目 改成你真实的项目文件夹(放你要让 AI 员工改的代码的地方):

PS> cd D:\你的项目

别在「下载」文件夹、解压安装包的文件夹里做这一步:那个文件夹会整个变成 AI 员工的工作区。KernelHub 会拒绝看起来像安装包解压目录的地方。

第 8 步 · 配对手机

PS> icloser pair

它会依次做三件事:

  1. 在当前目录建工作区。
  2. 问你「这台机器上,Agent 可以自己做到哪一步?」—— 直接回车就是第 3 档「读 + 写 + 执行」,能改文件、能跑构建和测试,多数人选它。
  3. 在窗口里画一个二维码,下面还有一条「扫不了就手工粘这条」的链接。

打开手机上的 KernelHub App 扫这个码。最后它会说「下一步只有一件事——让手机说的话有人接:icloser run」。

二维码被滚屏冲掉了?千万别再敲一次 pair。再 pair 一次会新建一个空工作区,原来的任务一个都不在里面。敲这一行把码重新调出来:
PS> icloser qr

也可以用图形界面:打开 KernelHub Desktop,点「连接手机」,用手机扫码。两种都行。

第 9 步 · 在手机 App 里输入邀请码

全新账户第一次 pair 时,窗口里会有这么一句(Mac / Linux 实测如此,Windows 是同一套 CLI):

  账户 7a9e5014 还没有使用权 —— 在 iPhone 或 Android 上输入一次邀请码即可,
  这台机器会自动继承(CLI 上没有激活入口)

意思是:这个账户还没有使用权,激活只能在手机上做,电脑这边没有入口。打开手机上的 KernelHub App,照提示输入邀请码;兑换成功后,这台电脑自动继承,不用再敲任何命令。

没有码怎么要,见使用权限与激活。已经激活过的账户,pair 时会说「使用权已继承」,这一步跳过。

第 10 步 · 开始接活

PS> icloser run

这个窗口别关。它会一直开着,每隔几秒去看有没有新任务 —— 手机上发的任务就是它接的。开头几行会说它加入了哪个工作区、选了哪家 Runtime。

第 11 步 · 发一条真任务,看它交付

第 10 步那个窗口开着的时候,拿起手机:

  1. 在 KernelHub App 里选中刚配对的工作区,在输入框里打一句话发出去。知道文件名就写上,比如「在 README.md 末尾加一行今天的日期,不要提交」。
  2. 电脑上跑 icloser run 的窗口会滚出新的几行 —— 说明任务被接住了。手机上的任务卡会变成实时视图:读了哪些文件、跑了哪些命令、改了哪些文件。
  3. 任务缺一档权限时,它会在动手之前停下来挂一张卡,点批准只对这一条任务生效。
  4. 跑完之后,点卡片上的「改动」逐行看它改了什么,再读结果:做了什么、改了什么、有什么没做成。结果不满意就点「要求修改」,让同一条任务接着做。

成功:任务状态是完成,「改动」里能看到 README.md 多出的那一行,打开电脑上的文件也确实多了一行。

新机器上没有 Go / Python,第一条任务不会为它停下
KernelHub 会顺手检查机器级的基础工具(Go、Python)。缺了、而这台机器又没批「访问互联网」时,任务照常往下跑,不挂卡icloser run 那个窗口里只多一行记账(CLI 源码里的原句):
  ⓘ go:KernelHub Base(机器级,与这条任务无关)没装上 —— 不挂卡、不阻塞,这条任务照常往下跑。要补齐:在这台机器上跑 icloser env bootstrap go,或在设备权限里批 exec + web 后它会自动补上。
只有任务真要用它 —— 原话里点了名(比如写了 go build),或者干活途中真去跑它 —— 而安装又被拒时,才会在那一刻挂一张卡;批准只对这一条任务生效。已经批过「执行」和「访问互联网」的机器上,它会自己装好接着做,一张卡都不挂(Windows 真机上见过)。

发出去一直没人接:回去看第 10 步那个窗口还在不在;还卡着就做下一步体检。

第 12 步 · 体检(另开一个 PowerShell)

第 10 步那个窗口在跑,所以另开一个 PowerShell,先 cd 到同一个项目目录,再跑:

PS> icloser doctor

服务、网关、队列、权限、Runtime 一次查完。哪一项不对,它会直接说下一步该敲什么。

第 13 步 · 关掉窗口也要接活:装成常驻

第 10 步那个窗口一关,手机上再发任务就没人接了。想让它登录 Windows 就自己起来,在项目目录下跑(不需要管理员,以你自己的账户运行):

PS> icloser daemon install

成功(CLI 源码里的原句)。2026-09-16 在 Windows 真机上装过:icloser daemon status 显示在跑,icloser doctor 报「✓ 常驻服务 已安装且正在运行」,一条任务由它接走并交付:

✓ 常驻已装好(计划任务:iCloser Agent)

之后随时用这一行看它在不在:

PS> icloser daemon status

装了常驻之后,第 10 步那个手动开的 icloser run 就可以关掉了,两个同时开是多余的。

进阶:开机不登录也要跑(Windows 服务)—— 先读完再决定
只有「这台机器没人登录也要接活」才需要它。普通用户用上面的 icloser daemon install 就够了,它不要密码;两个不要同时装。
  • 要「以管理员身份运行」的 PowerShell。
  • 必须是你自己的账户,写成 机器名\用户名(比如 JIMPC\Jim)。只写用户名,Windows 服务管理器不认(2026-09-16 真机实测)。不能是 LocalSystem:它看不到你的 Runtime 登录状态,命令会直接拒绝。
  • ⚠️ 密码目前只能写在命令行上。它会留在 PowerShell 的历史记录里,运行期间也能从进程的命令行看到。这是已知缺陷,还没修。不要把敲过密码的那一行复制给任何人,也不要贴进聊天或工单 —— 真机上发生过密码因此进了会话记录。
  • 怎么敲:在管理员 PowerShell 里先只敲 icloser service install。它会拒绝,并把该填的完整命令打印出来,账户那一段已经替你填成 机器名\用户名;把你自己的密码填进去再跑。
  • 装上之后起服务可能报 logon failure真机上遇到过,原因还没查清;用 Microsoft 账户或 PIN 登录的电脑,可能是因为服务要的密码和你平时解锁用的不是同一个 —— 这只是一种可能。遇到就用 icloser service uninstall 卸掉,改回 icloser daemon install

3 · 装完之后常用的

再装别的 Runtime(不用重跑整个安装)

默认只装了 claude。能用 npm 装的有:claudecodexqwencodebuddyopencodekimimimopi。下面这一行装的是 codex,换成其中任意一个即可:

PS> icloser env bootstrap codex

或者用安装命令指定(同样把 codex 换成你要的):

PS> $env:KERNELHUB_RUNTIME='codex'; irm https://icloser.xyz/install.ps1 | iex

装完同样要登录一次(敲它的名字,比如 codex)。Google 这一家是 agy(Antigravity),不走 npm,要从 Google 官方渠道装。

本机管理台

管理台是单独的程序icloser run 不会带起它。起它(这个窗口也会一直占着):

PS> kernelhub-desktop

然后在浏览器打开 http://127.0.0.1:18092。它只绑在本机回环地址,这台电脑之外够不着。看它现在在不在跑、地址是什么:

PS> icloser console

已经在跑的话,这一行帮你在默认浏览器里打开它:

PS> icloser open

4 · 完全离线:用离线整包(兜底,能上网就别用)

先确认真的走不了线上。网络只是慢或偶尔断,第 2 节那几条原样重跑就行;被代理或防火墙挡住,先看第 5 节。只有完全断网、或者规定只准用本地包时,才用这一节。
这一节的包信息来自 Windows 真机那边的打包记录,本站没有另外下载复核。文件名、网盘链接、体积与 SHA-256 照录如下;拿到包先核 SHA-256 再用

离线整包带齐了 Node、7-Zip、Python、Git、文档工具、各家 Runtime 的安装包和 KernelHub 三件套,装的过程不需要外网。

文件名kernelhub-from-zero-windows-x64-20260913.zip
网盘链接https://pan.baidu.com/s/16hoTpt3MoPlqjtgw5w6DyA
提取码2b3w
体积970,619,689 字节(约 925.6 MiB)
整包校验用和整包放在一起的旁挂文件 kernelhub-from-zero-windows-x64-20260913.zip.sha256 核。本页不印固定哈希 —— 这个包重打过一次,字节数一样而哈希变了,印死的数字会让人误以为文件被动过。
包内条目50 个;解压后根目录是 kernelhub-from-zero-windows-x64\,安装文件都在 winx64\

4.1 先核整包,再解压

下面默认包在「下载」文件夹里;不在就把命令里的路径改掉。

下载时把整包和它旁边那个 .sha256 文件一起下下来,放同一个文件夹。下面这一行自己读旁挂文件、自己算、自己比,不用你肉眼对:

PS> $zip="$env:USERPROFILE\Downloads\kernelhub-from-zero-windows-x64-20260913.zip"; if(-not (Test-Path -LiteralPath $zip)){'找不到整包,请把 $zip 改成实际路径'}elseif(-not (Test-Path -LiteralPath "$zip.sha256")){'旁边缺 .sha256 文件 —— 它和整包放在一起,一起下下来再跑这一行'}else{$want=[regex]::Match((Get-Content -Raw -LiteralPath "$zip.sha256"),'[0-9a-fA-F]{64}').Value.ToLower(); $got=((certutil -hashfile $zip SHA256 | Select-Object -Index 1) -replace ' ','').ToLower(); if($want -eq ''){'旁挂文件里没有 64 位哈希,先确认它下全了'}elseif($got -eq $want){"OK $got"}else{"MISMATCH 期望 $want 实际 $got"}}

成功:打出 OK 加那串哈希:

OK  <旁挂文件里的那串哈希>

对不上就别用 —— 传输坏了或被人动过,重新下一遍(两个文件都要重下):

MISMATCH  期望 <旁挂文件里的那串>  实际 <这台机器上算出来的那串>

解压到 D:\kh-apps(后面的命令都默认在这里):

PS> $zip="$env:USERPROFILE\Downloads\kernelhub-from-zero-windows-x64-20260913.zip"; New-Item -ItemType Directory -Force -Path D:\kh-apps | Out-Null; Expand-Archive -LiteralPath $zip -DestinationPath D:\kh-apps -Force; '解压完成:'; Test-Path 'D:\kh-apps\kernelhub-from-zero-windows-x64\winx64\stable.json'

成功:最后一行是 True

解压完成:
True

下面每条命令都以 $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; 开头,是为了每一行都能单独复制、单独跑。解压到别处的话,把每行开头这一小段路径改掉。

4.2 装机顺序(照这个顺序,别跳)

① 装 7-Zip(后面的 .7z 都靠它解开,会弹图形安装器):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; & "$P\winx64\missing\7z2603-x64.exe"

确认装好了(打出一个 7z 的路径即可):

PS> where.exe 7z

② 解开 Node.js 26.8.2(整条离线路线的前提,没有 npm 后面一个 Runtime 都装不上):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; & "C:\Program Files\7-Zip\7z.exe" x "$P\winx64\missing\node-26.8.2-win32-x64.7z" -o"D:\tools\node" -y

找到 node.exe、临时加进当前窗口的 PATH 并自证(打出两行版本号即成功):

PS> $ndir=(Get-ChildItem -Path D:\tools\node -Recurse -Filter node.exe | Select-Object -First 1).DirectoryName; $env:Path="$ndir;$env:Path"; node -v; npm -v

写进用户级 PATH,以后每个新窗口都认得:

PS> $ndir=(Get-ChildItem -Path D:\tools\node -Recurse -Filter node.exe | Select-Object -First 1).DirectoryName; $u=[Environment]::GetEnvironmentVariable('Path','User'); if(-not $u){$u=''}; if(($u -split ';') -notcontains $ndir){ [Environment]::SetEnvironmentVariable('Path',($u.TrimEnd(';') + ';' + $ndir),'User'); '已加入 PATH' } else { '本来就在 PATH 里' }

③ 装 KernelHub 三件套(不需要管理员)—— 这一行照安装脚本的做法:拷 CLI 与管理台到 %LOCALAPPDATA%\Programs\icloser、建三个旧名、写用户级 PATH、最后自证:

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $D="$env:LOCALAPPDATA\Programs\icloser"; New-Item -ItemType Directory -Force -Path $D | Out-Null; Copy-Item "$P\winx64\icloser_windows_amd64.exe" "$D\icloser.exe" -Force; Copy-Item "$P\winx64\kernelhub-desktop_windows_amd64.exe" "$D\kernelhub-desktop.exe" -Force; foreach($a in 'icli','kernelhub-cli','devnexus-cli'){ Set-Content -Path "$D\$a.cmd" -Encoding ASCII -Value ("@echo off`r`n`"%~dp0icloser.exe`" %*`r`nexit /b %ERRORLEVEL%") }; $u=[Environment]::GetEnvironmentVariable('Path','User'); if(-not $u){$u=''}; if(($u -split ';') -notcontains $D){ [Environment]::SetEnvironmentVariable('Path',($u.TrimEnd(';') + ';' + $D),'User') }; $env:Path="$env:Path;$D"; icloser version

成功:最后一行打出 icloser 的版本行,版本号与构建号和整包里 winx64\stable.json 写的一致(整包是 2026-09-13 打的,里面是那时的版本,不是本页顶上的这一版)。另一条路(需要管理员)是装 MSI:

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $j=Get-Content "$P\winx64\stable.json" -Raw -Encoding UTF8 | ConvertFrom-Json; msiexec /i "$P\winx64\$($j.apps.windows_desktop_x64.file)"

④ 装 Runtime —— 顺序很重要:先装「真身」,再装「壳包」

为什么顺序不能反
顶层 tgz 里有 4 个是空壳:claude 27,741 字节、codex 4,902、opencode 3,051、mimo 5,310 —— 这个体积放不下一个 CLI。它们的真身在 platform-win-x64\ 里的另一个包。只装壳包,npm 还会去网上取真身;断网时你得到一个起不来的空壳,而且报错看不出是「包不全」。
Runtime顶层壳包字节Windows 真身在不在包里
claude27,741在:platform-win-x64\anthropic-ai-claude-code-win32-x64-2.1.270.tgz
codex4,902在:platform-win-x64\openai-codex-0.154.0-win32-x64.tgz
opencode3,051在:platform-win-x64\opencode-windows-x64-1.18.30.tgz
mimo5,310在:platform-win-x64\mimo-ai-mimocode-windows-x64-0.1.14.tgz
qwen28,929,854自带 dist/vendor,但全部依赖没有打进来
codebuddy54,680,912自带 dist/vendor,同上
kimi19,646,415自带 dist/native,同上
pi6,986,356声明了 18 个常规依赖,没有打进来

先装 4 个真身:

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\platform-win-x64\anthropic-ai-claude-code-win32-x64-2.1.270.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\platform-win-x64\openai-codex-0.154.0-win32-x64.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\platform-win-x64\opencode-windows-x64-1.18.30.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\platform-win-x64\mimo-ai-mimocode-windows-x64-0.1.14.tgz"

再装 8 个壳包(顶层 tgz):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\anthropic-ai-claude-code-2.1.270.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\openai-codex-0.154.0.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\qwen-code-qwen-code-0.23.3.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\tencent-ai-codebuddy-code-2.150.0.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\opencode-ai-1.18.30.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\moonshot-ai-kimi-code-0.42.0.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\mimo-ai-cli-0.1.14.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\earendil-works-pi-coding-agent-0.85.1.tgz"

第 9 家 agy(Antigravity)不走 npm,跑包里的 Google 官方安装程序,再自证:

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; & "$P\winx64\missing\antigravity-cli-1.2.2-windows-x64.exe"
PS> agy --version

⑤ 逐个登录:每家都要在 PowerShell 里敲一次它的名字(claudecodexqwencodebuddyopencodekimimimopiagy),按提示登录,否则不能跑任务。

⑥ 接上手机并开始接活:回到第 2 节,从第 7 步(进项目目录)做到第 13 步。项目目录不要D:\kh-apps 下面。

4.3 包里的基础工具(按需,不必都装)

落地目录 D:\tools\… 只是示例,换哪里都行,记得把它的 bin 加进 PATH。

Python 3.12.10(免安装、不写注册表、不需要管理员):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; New-Item -ItemType Directory -Force -Path D:\tools\python312 | Out-Null; tar -xzf "$P\winx64\missing\cpython-3.12.10+20250409-x86_64-pc-windows-msvc-install_only.tar.gz" -C D:\tools\python312 --strip-components=1; D:\tools\python312\python.exe -V

Python 3.14.7(同目录另有,按项目选):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; New-Item -ItemType Directory -Force -Path D:\tools\python314 | Out-Null; tar -xzf "$P\winx64\missing\cpython-3.14.7+20260901-x86_64-pc-windows-msvc-install_only.tar.gz" -C D:\tools\python314 --strip-components=1; D:\tools\python314\python.exe -V

Git 便携版(自解压;-o / -y 是 7z 自解压包的通用开关,底稿里标注未实测):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; & "$P\winx64\missing\PortableGit-2.55.0.5-64-bit.7z.exe" -o"D:\tools\git" -y; & "D:\tools\git\cmd\git.exe" --version

uv(Python 包管理器):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; Expand-Archive -Path "$P\winx64\missing\uv-x86_64-pc-windows-msvc.zip" -DestinationPath D:\tools\uv -Force

ripgrep(rg.exe):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; Expand-Archive -Path "$P\winx64\missing\ripgrep-15.2.0-x86_64-pc-windows-msvc.zip" -DestinationPath D:\tools\rg -Force

jq(单文件 exe):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; New-Item -ItemType Directory -Force -Path D:\tools\rg | Out-Null; Copy-Item "$P\winx64\missing\jq-windows-amd64.exe" D:\tools\rg\jq.exe -Force

pandoc 3.11(文档转换):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; Expand-Archive -Path "$P\winx64\missing\pandoc-3.11-windows-x86_64.zip" -DestinationPath D:\tools\pandoc -Force

poppler(含 pdftotext.exe):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; Expand-Archive -Path "$P\winx64\missing\Release-26.07.0-0.zip" -DestinationPath D:\tools\poppler -Force

Python 文档处理插件(这一条要联网;用哪个 Python 就换成哪个 exe):

PS> D:\tools\python312\python.exe -m pip install python-docx openpyxl xlrd python-pptx pypdf pdfplumber PyMuPDF pandas odfpy markdownify markitdown beautifulsoup4 lxml reportlab Jinja2 tabulate Pillow pytesseract pdf2image

注意:pytesseract 还要另装 Tesseract 本体;pdf2image 依赖上面的 poppler。文档处理用到的 imagemagick 包里没有,需要时从 imagemagick.org 取 Windows 版并自己核哈希。

4.4 离线路线的三条限制(一定要知道)

限制 1 · 装得上 ≠ 派得了任务。Agent 在本地跑,但把任务从手机送到这台电脑的是控制面,那条链路要网络。离线包解决的是「装」;被堵的环境里你仍然需要一条能到控制面的通路(第 5 节的代理 / 隧道),否则会卡在配对那一步。
限制 2 · 4 家的真身不在顶层 tgz 里。claude / codex / opencode / mimo 必须按 4.2 的顺序「先真身后壳包」。qwen / codebuddy / kimi / pi 的全部依赖没有打进来 —— 要彻底离线,得在一台能上网的机器上 npm install -g 装好,再把全局 node_modules 整个打包带走。
限制 3 · npm install -g 本地 tgz 仍会去找网上的 registry 解析依赖。有代理就先把第 5 节的代理和 npm 设置做好再装;彻底断网就按限制 2 的办法。

5 · 网络被堵:把命令通到外面

先对照第 2 节开头那张表,搞清楚被堵的是哪一段。下面每条都能单独复制。

5.1 设代理(只对当前这个窗口生效)

端口 换成你自己的代理地址和端口(代理软件的设置里能看到,常见叫 mixed-port / HTTP 端口)。curl.exehttp_proxy / https_proxy,PowerShell 的 irm 走 .NET 的默认代理 —— 这一行两套一起设,最后自证:

PS> $proxy='http://127.0.0.1:端口'; $env:http_proxy=$proxy; $env:https_proxy=$proxy; [Net.WebRequest]::DefaultWebProxy=New-Object Net.WebProxy($proxy); curl.exe -sS -o NUL -w "install.ps1 -> HTTP %{http_code}`n" https://icloser.xyz/install.ps1

成功:

install.ps1 -> HTTP 200

打不出 HTTP 200:代理地址或代理本身不对,先别往下走。通了之后,第 2 节的原命令不用改,照常在这个窗口里跑。

5.2 npm 换镜像

换成镜像并自证(会回显镜像地址):

PS> npm config set registry https://registry.npmmirror.com; npm config get registry

只这一次用镜像,不动全局设置:

PS> npm install -g @anthropic-ai/claude-code --registry=https://registry.npmmirror.com

有代理时把代理也写进 npm:

PS> if($env:http_proxy){ npm config set proxy $env:http_proxy; npm config set https-proxy $env:http_proxy; npm config get proxy } else { '请先设 $env:http_proxy(见上一条),再跑这一行' }

registry.npmmirror.com 是常见的公共镜像,换别的镜像把地址替换掉即可。

5.3 pip 换镜像

写进配置,以后都走清华镜像,并自证:

PS> D:\tools\python312\python.exe -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple; D:\tools\python312\python.exe -m pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn; D:\tools\python312\python.exe -m pip config list

只这一次:

PS> D:\tools\python312\python.exe -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx openpyxl pandas

5.4 换 KernelHub 自己的下载源

公司内网有镜像时用(镜像要照原样镜像官方目录,清单里的 SHA-256 仍然会核):

PS> $env:KERNELHUB_INSTALL_BASE='https://你的镜像.example.com/kernelhub'; irm https://icloser.xyz/install.ps1 | iex

注意:这只换「清单与安装包」从哪下,安装脚本本身仍然从 icloser.xyz 取

5.5 另外三个安装开关

换安装目录(默认 %LOCALAPPDATA%\Programs\icloser):

PS> $env:KERNELHUB_BIN_DIR='D:\tools\icloser'; irm https://icloser.xyz/install.ps1 | iex

一个 Runtime 都不装(只要 CLI):

PS> $env:KERNELHUB_SKIP_RUNTIME=1; irm https://icloser.xyz/install.ps1 | iex

装指定的那一家(见第 3 节的 codex 那一行,把 codex 换掉即可)。

6 · 自己核一遍文件对不对

「文件放上去了」不等于「装好了」。下面这些校验不需要联网,用 Windows 自带的 certutil

核已经装好的 icloser.exe(第 4 步线上装的:x64 和下表第一行比,ARM64 和第二行比):

PS> certutil -hashfile "$env:LOCALAPPDATA\Programs\icloser\icloser.exe" SHA256

离线包里的三件套,一行自动和包内清单比对(打出 OK 开头即对):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $j=Get-Content "$P\winx64\stable.json" -Raw -Encoding UTF8 | ConvertFrom-Json; $g=((certutil -hashfile "$P\winx64\icloser_windows_amd64.exe" SHA256)[1] -replace ' ','').ToLower(); if($g -eq $j.platforms.'windows-amd64'.sha256.ToLower()){"OK icloser $g"}else{"MISMATCH expected $($j.platforms.'windows-amd64'.sha256) got $g"}
OK  icloser  <整包 winx64\stable.json 里记的那串哈希>
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $j=Get-Content "$P\winx64\stable.json" -Raw -Encoding UTF8 | ConvertFrom-Json; $g=((certutil -hashfile "$P\winx64\kernelhub-desktop_windows_amd64.exe" SHA256)[1] -replace ' ','').ToLower(); if($g -eq $j.desktop.'windows-amd64'.sha256.ToLower()){"OK desktop $g"}else{"MISMATCH expected $($j.desktop.'windows-amd64'.sha256) got $g"}
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $j=Get-Content "$P\winx64\stable.json" -Raw -Encoding UTF8 | ConvertFrom-Json; $g=((certutil -hashfile "$P\winx64\$($j.apps.windows_desktop_x64.file)" SHA256)[1] -replace ' ','').ToLower(); if($g -eq $j.apps.windows_desktop_x64.sha256.ToLower()){"OK msi $g"}else{"MISMATCH expected $($j.apps.windows_desktop_x64.sha256) got $g"}
文件字节SHA-256
icloser_windows_amd64.exe(线上安装,v1.0.2)13,111,296eafd5e4749736b039ee5ade97137f10aa864b4a09c92b5d5b25bd36dd0050ce6
icloser_windows_arm64.exe(线上安装,v1.0.2)12,070,400d652cb0275e5a23bcbf6c3bc682f99a09e6419fff11bd2f3673f6e92adafe067
KernelHub-Setup-1.0.2-windows-x64.msi(下载页 · Windows x64 安装包,v1.0.2)9,154,560fa7a9af8b657dce72ebc2a4f9b29c4aaf4ddaf59b1c759f900296b7688d595e6
KernelHub-1.0.2-windows-arm64-portable.zip(下载页 · Windows ARM64 便携包,v1.0.2)7,961,700e4de254b316cd6d18ca14d2b894aca568606284180c067efdf0bc74394d347fe
离线整包里的 CLI、管理台与 MSI以整包里自带的 winx64\stable.json 为准,本页不印(上面三行命令会自动比)
node-v24.21.0-x64.msi(第 2 步路 B)bb0eaee134f9357f22aea915ee793343e627aefc1e66488164bac6915bce2cac
离线整包 zip(第 4 节)970,619,689以包外旁挂的 .zip.sha256 为准,本页不印(第 4.1 节那一行会自动比)

前四行是构建本页时从这一版的发布清单 stable.json 读进来的;离线整包里的文件不在这里印数字 —— 整包打于 2026-09-13,和这一版不是同一批,它们的哈希以整包自带的 stable.json 为准;Node 那一行来自 nodejs.org 的 SHASUMS256.txt;离线整包不在这里印哈希,理由见上面一行。

整包逐文件核对(可选,近 1 GB 会跑一会儿;全对逐行打印 ok):

PS> $ws='D:\kh-apps\kernelhub-from-zero-windows-x64'; (([IO.File]::ReadAllText("$ws\SHA256SUMS-安装包.txt",[Text.Encoding]::UTF8)) -split "`r?`n") | ForEach-Object { if($_ -match '^([0-9a-f]{64}) (.+)$'){ $f=Join-Path $ws ($Matches[2] -replace '/','\'); if(-not (Test-Path -LiteralPath $f)){ "MISSING : $($Matches[2])"; return }; $got=((certutil -hashfile "$f" SHA256) | Select-Object -Index 1).Trim() -replace ' ',''; if($got.ToLower() -ne $Matches[1]){ "MISMATCH: $($Matches[2])" } else { "ok : $($Matches[2])" } } }

7 · 常见报错:症状 → 原因 → 那一行命令

你看到的原因怎么办
node / npm 无法识别为 cmdlet没装 Node,或装完没开新窗口做第 2 步;装完关掉窗口重开
安装时 ! No npm on this machine, so no runtime was installed先装了 KernelHub 后装 Node装好 Node、开新窗口,再跑 irm https://icloser.xyz/install.ps1 | iex
icloser 无法识别为 cmdlet老窗口没拿到新 PATH关掉窗口重开;还不行重跑第 4 步
irm 卡住、超时、连接被关闭icloser.xyz 被挡第 5.1 节设代理;或第 4 节离线包
npm install -g 卡住 / ECONNRESETnpm 官方源被挡第 5.2 节换 npm 镜像
任务回「本机一家都跑不了」Runtime 没装或没登录claude 登录,再 icloser runtimes 看状态
手机扫了码,发的任务一直没人接icloser run 没开着,也没装常驻在项目目录跑 icloser run,或第 13 步 icloser daemon install
icloser version 打出的不是这一版,或者是别的工具的帮助菜单PATH 上排在前面的同名东西抢了名字(npm 全局的 iCloser、旧 MSI)改用 icli;详见第 5 步
icloser doctor 说「常驻服务 已安装但没在跑」计划任务被结束了照它印的做:icloser run 就地起,或 icloser daemon install 重装一次
二维码被冲掉了窗口滚屏icloser qr别再 pair
service install 报「缺 --password」或「必须指定以哪个账户运行」Windows 服务要账户和密码用第 13 步的 icloser daemon install,不要密码;真要服务先读第 13 步的「进阶」那一段(密码会留在命令行历史里)
服务装上了,起的时候报 logon failure原因没查清;Microsoft 账户 / PIN 登录的电脑上可能是密码对不上icloser service uninstall,改用 icloser daemon install
服务显示正在运行,任务却全失败服务跑在 LocalSystem 下,看不到你的登录状态卸掉,改用你自己的账户,或用 icloser daemon install
Windows 弹「未知发布者」/ SmartScreen 拦截Windows 产物目前没有 Authenticode 签名先按第 6 节核 SHA-256,对上了再点「仍要运行」
SHA-256 对不上下载坏了或被换了删掉重下;不要装
下载中途报错,或 Download failed … the manifest and the server disagree多半是网络中途断了(Mac / Linux 实测,同一类安装器报的就是这句的中文版;Windows 是同一套判断)原命令再跑一遍

8 · 卸载 / 清干净

① 装过常驻的,先卸常驻(在任意目录跑):

PS> icloser daemon uninstall

② 先看清楚要删什么(只列,不删):

PS> Get-ChildItem -Force -Directory "$env:USERPROFILE" | Where-Object { $_.Name -in @('.kernelhub','.kernelhub-gate','.kernelhub-protected') } | Select-Object FullName

③ 删数据目录。三个目录分别是配置与任务台账、身份凭据、受保护的根目录,三个都删掉才算清干净。删了就要重新配对:

PS> Remove-Item -Recurse -Force "$env:USERPROFILE\.kernelhub","$env:USERPROFILE\.kernelhub-gate","$env:USERPROFILE\.kernelhub-protected" -ErrorAction SilentlyContinue

④ 删程序本体:

PS> Remove-Item -Recurse -Force "$env:LOCALAPPDATA\Programs\icloser"

最后可以在「设置 → 系统 → 关于 → 高级系统设置 → 环境变量」里,把用户 Path 里那条 …\Programs\icloser 删掉。Node 与各家 Runtime 是你自己装的,要删请用各自的卸载方式。

接着看:快速上手 · 配对 · 故障排查