chore(release): 版本统一至 v2.1.0 + CHANGELOG 回填未发布提交

- 经 scripts/lib/version-write.mjs 写入全部 11 处(8 package.json +
  tauri.conf.json + Cargo.toml/lock),无散点遗漏、无 skipped
- CHANGELOG [未发布] 段补入 v2.0.3..HEAD 全部提交主题:
  L2 系统级审计(7d781d1)、交付流水线(2bf45fd)、Linux 适配(00992e5)、
  质量门禁与 CI(141f479 等 4 个)、console-release(9f95560);
  并修正「安装包尚未接入 Release」的过期记述
- version-write 单测 12/12 绿(含仓库版本号一致性守卫)
This commit is contained in:
jkooe committed 2026-10-25 23:37:52 +08:00
1 parent 3680218010
commit a75c5c9bc5
13 files changed
+98 -13

No files matched your search

+86 -1
View File
@@ -7,6 +7,89 @@
## [未发布]
### 新增 —— L2 系统级审计兜底(`7d781d1`,`docs/AUDIT-L2.md`)
L1 是 agent 自己记的,只看得见经过自己 RPC 的调用;攻击者**绕过 agent 直接操作机器、
或把 agent 停掉**时 L1 全盲。L2 采集操作系统自己的审计事件,补的正是这块。
- **信任边界(写进能力描述与文档,不夸大)**:采集器与 agent 同进程同权限 ——
能停 agent 就能停采集器。故本地 `audit-l2.log` 只是**归一化副本**,防篡改价值有限;
真正的独立性来自**把记录转发出机**(与 SECURITY.md §4.8 锚定同一思路)。本实现不自动转发。
- **Windows 落地**(选内置 auditpol 而非 Sysmon —— 第三方驱动需单独分发、重启生效、
版本行为有差异;内置策略零依赖即可立起来;检测到 Sysmon 则并用,未装不尝试下载):
- `status`:查策略是否启用,并提示两个关键开关 —— `SCENoApplyLegacyAuditPolicy`
(不设它,组策略旧式类别策略会盖掉 subcategory,表现为「auditpol 显示已启用但
事件日志里没有 4688」)与 `ProcessCreationIncludeCmdLine_Enabled`(不开则 4688
只有进程名,看不到参数);
- `enable`(需管理员)/ `collect`(拉取并归一化落盘,独立于 L1 的 `audit-l2.log`)/
`verify`(校验 L2 链,与 L1 同构的「对含 prev 的记录求哈希」)。
- **三端现状如实记录**:Linux(auditd)需预装、macOS(ESF)受 Apple entitlement
限制,均**未实现** —— 非 Windows 被控端明确报 `E_UNSUPPORTED_PLATFORM`,
不伪装成空结果。CLI 已有 `nodeagent audit l2` 入口。
### 新增 —— 交付流水线规范落地(`2bf45fd`,`docs/DELIVERY-PIPELINE.md`)
将《代码审计 → 上线 完整交付方案》适配到 nodeagent。原方案面向 Web/容器服务,
nodeagent 无服务端、无容器、无多环境 —— 照搬会产生「跑得很好但守不住任何东西」的
假门禁,故每个阶段给三档判定:适用 / 改造后适用 / 不适用(但必须给替代)。
关键替换:容器镜像扫描 → **交付物 PE 架构断言**(arm64 包误装 x64 node.exe 的真实事故);
DAST → **协议健壮性测试**(对外输入面是 WebSocket RPC,非 HTTP);
dev/staging/prod → **真机矩阵**(Win x64/arm64、macOS、Linux);
金丝雀 → **设备分批自更新**(先一台试点,latest.json 灰度);
Prometheus → `system.metrics` + 发布后复核清单。
- 覆盖率门禁 `scripts/ci/check-coverage.mjs`:全量**只观测不阻断**(实测基线 66.9%),
变更文件行覆盖 ≥70% 阻断。
- **LKG 回滚锚点**:被控端「能启动」后记最后已知可用版本(`agent-lkg.json`),
给回滚提供确定目标;**刻意不做自动回滚**(无法归因、回滚循环、失控 —— 决策权留给控制端)。
### 新增 —— Linux 被控端适配(`00992e5`,`docs/DEPLOY-LINUX.md`)
面向「服务器型被控端」(命令/状态/文件/审计;无 GUI),实测环境 Debian 12。
- `scripts/install-linux.sh`:一键安装器(对齐 Windows `install.ps1` 语义)——
自动获取 Node 运行时(走 npmmirror)、**systemd 服务**(系统级 / 用户级+linger /
`--no-service` 三种模式)开机自启、幂等(复用既有密钥并自动备份 `agent.json`)、
卸载保留配置(`--purge` 才删)。
- `apps/agent/src/util/platform.ts`:**统一平台守卫**(`assertPlatform` /
`assertGuiPlatform` / `assertWindows`),抛 `E_UNSUPPORTED_PLATFORM` 并带上
「支持哪些平台」。修复前的表现是**误导性错误**(`screen.capture` 在 Linux 上报
「region 宽高必须 ≥ 1」,像是参数没传对)。
- `scripts/verify.mjs`:补 `E_UNSUPPORTED_PLATFORM → skip`(此前把「平台不支持」
记成失败)。
### 变更 —— 质量门禁与 CI 修复(`141f479` / `c7d596e` / `630ea7d` / `3680218`)
质量门禁曾**连续 8 次运行全部失败**(从引入起就没绿过)—— 一道长期红的门禁等于
没有门禁。两处独立原因:
- **SCA**:`.npmrc` 指向 npmmirror(加速用),但镜像不实现 audit 接口,
`pnpm audit` 必报 `ERR_PNPM_AUDIT_ENDPOINT_NOT_EXISTS` → 显式加
`--registry=https://registry.npmjs.org`。
- **typecheck 缺 build 顺序**:各包 import 的是 `@nodeagent/protocol` 的**类型产物**
(`dist/*.d.ts`)。CI 全新检出没有 dist → 集体 `TS2307: Cannot find module`,
而本地因为 dist 还在看不出来(典型「本地绿 / CI 红」)→ typecheck 前先建 protocol。
注入验证:移走 `packages/protocol/dist` 复现 TS2307 → 执行 build 步骤 → 零错误。
- 精确忽略 4 处测试占位密钥误报(`630ea7d`);typecheck 前改为**全量构建**
(只建 protocol 不够,`3680218`)。
### 新增 —— 控制台安装包接入 Release(`9f95560`)
`scripts/release.mjs` 此前只产出 agent / cli / mcp,`apps/console` 从来没接进去。
后果很具体:控制台修复**只存在于 CI artifact**,而 artifact retention 是 7 天 ——
用户从 Release 页面下载到的永远是旧控制台(「修复发了但没人拿得到」)。
- `console-windows.yml` 加 `workflow_call:` + `publish` job:只有 tag 才发布;
下载两架构产物 → **断言安装包数 ≥ 4**(exe+msi × x64/arm64),少了直接报红,
绝不静默少发一个架构;`gh release upload --clobber` 挂到 Release。
- 新增 `console-release.yml`:只认 `push: tags: ['v*']`。
- **为什么不把 tags 直接写进 console-windows.yml**:它带 `paths` 过滤,
`paths` 与 `tags` 并存时 tag 推送会被路径判定挡掉而**静默不触发** ——
失败形态是「什么都没发生」,最难察觉。拆成「日常验证走分支 + 发布只认 tag」最稳。
---
> 主题:**控制台「去命令行化」** —— 双击应用即用,启停/重启/更新/日志/托盘常驻/开机自启全部在界面里完成。
> 目标原文:「不再打开命令行窗口,运行应用之后,有启动、停止、重启、检查更新等功能,
> 有日志功能,可以后台运行和开机自启等等功能」。
@@ -113,7 +196,9 @@
故 `taskkill` 收进程树、PowerShell 计划任务、`node.exe` 路径等分支此前从未产出过 Windows 产物。
- **实测产物**:x64 `.msi` **34.2 MiB** / NSIS **23.2 MiB**;arm64 NSIS **19.5 MiB**(均低于 40MB 目标)。
`if-no-files-found: error` + `fail-fast: false`:一条架构没产出就报错,同时一条挂了不掩盖另一条的结果。
- **尚未接入 `scripts/release.mjs`**:安装包目前只作为 CI artifact 产出,未随 Release 发布。
- **接入 Release**:安装包起初只作为 CI artifact 产出(retention 7 天),已由本版
「控制台安装包接入 Release」一节补上 —— tag 发布时四包(exe+msi × x64/arm64)
挂到 GitHub Release,修复才真正到得了用户手里。
> **首个 run 两个 job 全红,但错的不是构建,是断言。**(run `38151366534`)
> 两个 job 的失败点完全一致,而日志显示构建链路**一路全绿**:构建机架构(arm64 runner 上
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@nodeagent/agent",
"version": "2.0.3",
"version": "2.1.0",
"private": true,
"type": "module",
"main": "./dist/index.js",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@nodeagent/cli",
"version": "2.0.3",
"version": "2.1.0",
"private": true,
"type": "module",
"main": "./dist/index.js",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "nodeagent-console",
"private": true,
"version": "2.0.3",
"version": "2.1.0",
"type": "module",
"scripts": {
"dev": "vite",
+1 -1
View File
@@ -2101,7 +2101,7 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
[[package]]
name = "nodeagent-console"
version = "2.0.3"
version = "2.1.0"
dependencies = [
"serde",
"serde_json",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "nodeagent-console"
version = "2.0.3"
version = "2.1.0"
description = "nodeagent 桌面控制台(主控 + 被控一体,含本机服务托管)"
authors = ["jkooe"]
edition = "2021"
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "nodeagent-console",
"version": "2.0.3",
"version": "2.1.0",
"identifier": "cn.jkooe.nodeagent-console",
"build": {
"beforeDevCommand": "pnpm dev",
+1 -1
View File
@@ -1,6 +1,6 @@
<script setup lang="ts">
/**
* 退出确认(2026-10-17 皇上需求)。
* 退出确认(2026-10-17 需求方提出)。
*
* ## 它解决的误解
* 旧行为:点托盘「退出」→ 控制台立刻消失,但被控端因 `kill_on_drop(false)`
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@nodeagent/hub",
"version": "2.0.3",
"version": "2.1.0",
"private": true,
"type": "module",
"main": "./dist/index.js",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@nodeagent/mcp",
"version": "2.0.3",
"version": "2.1.0",
"private": true,
"type": "module",
"main": "./dist/index.js",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "nodeagent",
"private": true,
"version": "2.0.3",
"version": "2.1.0",
"description": "跨机 AI 接管框架 —— 让 Mac 上的 AI 无缝接管 Windows,装软件、查状态",
"type": "module",
"engines": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@nodeagent/client",
"version": "2.0.3",
"version": "2.1.0",
"private": true,
"type": "module",
"main": "./dist/index.js",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@nodeagent/protocol",
"version": "2.0.3",
"version": "2.1.0",
"private": true,
"type": "module",
"main": "./dist/index.js",