From 3748d01094b61f19a2c3abaf939c2a6cdde5256c Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Wed, 21 Oct 2026 13:20:56 +0800 Subject: [PATCH 1/4] =?UTF-8?q?refactor(deploy):=20systemd=20=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=94=B9=E5=90=8D=20hologramagent.service=20+=20?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=93=81=E7=89=8C=E5=8C=96=EF=BC=88=E6=94=B9?= =?UTF-8?q?=E5=90=8D=E6=89=B9=202/5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 批 2 的范围只有 deploy/ 的品牌落地:包名、单元名、安装路径、control、 spec、nsi、ps1。域名归批 5、仓库名归批 4、SDK module 路径归批 3, LDFLAGS/Makefile 的 module 注入归批 1 —— 本批一行未碰。 单元:deploy/homeagent.service → deploy/hologramagent.service(git mv) - Description/Documentation 品牌名 - ExecStart --data /var/lib/hologram、WorkingDirectory 同步 - StateDirectory=homeagent → hologram(不跟着改的话,systemd 会按旧名 建 /var/lib/private/homeagent 并把 ReadWritePaths 指向另一个目录, 内核起得来但写的位置是错的) - ONNXRUNTIME_DIR=/usr/lib/hologram/onnxruntime - LoadCredential :/etc/hologram/security.key、ReadOnlyPaths=/etc/hologram 注释里刻意保留一条 /var/lib/homeagent("从旧版磁盘钥升级时"的说明): 那条讲的就是**旧路径**上的历史密钥,改成新路径反而会误导升级操作。 embed-sidecar.service 只改 Description 里的品牌名(它与内核安装布局无关)。 --- ...omeagent.service => hologramagent.service} | 28 +++++++++---------- .../{homeagent.spec => hologramagent.spec} | 0 deploy/systemd/embed-sidecar.service | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) rename deploy/{homeagent.service => hologramagent.service} (84%) rename deploy/packaging/linux/{homeagent.spec => hologramagent.spec} (100%) diff --git a/deploy/homeagent.service b/deploy/hologramagent.service similarity index 84% rename from deploy/homeagent.service rename to deploy/hologramagent.service index 013ac613..8f636ed0 100644 --- a/deploy/homeagent.service +++ b/deploy/hologramagent.service @@ -1,6 +1,6 @@ [Unit] -Description=HomeAgent - 24/7 AI Butler -Documentation=https://github.com/trueagent/HomeAgent +Description=HologramAgent - 24/7 AI Butler +Documentation=https://github.com/trueagent/HologramAgent After=network-online.target docker.service Wants=network-online.target @@ -28,9 +28,9 @@ Wants=network-online.target Type=exec # ★ guard 模式(与本机生产实例一致)。 -# 数据目录默认 /var/lib/homeagent(Debian 惯例);迁移到别的目录时 +# 数据目录默认 /var/lib/hologram(Debian 惯例);迁移到别的目录时 # 必须**同时**改这里和 core.daemon.data_dir —— 两者不等价,见 README。 -ExecStart=/usr/bin/homed --role=guard --data /var/lib/homeagent +ExecStart=/usr/bin/homed --role=guard --data /var/lib/hologram Restart=always RestartSec=10 @@ -58,11 +58,11 @@ TimeoutStopSec=25s # 一起收,双保险不留孤儿进程。 KillMode=control-group -WorkingDirectory=/var/lib/homeagent -StateDirectory=homeagent +WorkingDirectory=/var/lib/hologram +StateDirectory=hologram Environment=HOME=/root # onnx 运行库随包安装(不在 /opt,见 packaging/package-linux.sh) -Environment=ONNXRUNTIME_DIR=/usr/lib/homeagent/onnxruntime +Environment=ONNXRUNTIME_DIR=/usr/lib/hologram/onnxruntime # ★ 主密钥生产注入(security/key.go) # @@ -74,8 +74,8 @@ Environment=ONNXRUNTIME_DIR=/usr/lib/homeagent/onnxruntime # 不在磁盘留副本、也不进 environ。 # # 生成密钥(一次性,然后妥善保管): -# head -c 32 /dev/urandom | xxd -p -c 64 | sudo tee /etc/homeagent/security.key -# sudo chmod 600 /etc/homeagent/security.key +# head -c 32 /dev/urandom | xxd -p -c 64 | sudo tee /etc/hologram/security.key +# sudo chmod 600 /etc/hologram/security.key # # ⚠ 该文件就是数据的主密钥:**丢了它,已加密的变量全部解不开**(响亮失败, # 不会静默重建)。请与备份一并保管。 @@ -83,11 +83,11 @@ Environment=ONNXRUNTIME_DIR=/usr/lib/homeagent/onnxruntime # ⚠ 未配置时**不要**留一个空文件 —— 凭据目录一旦被设置而凭据缺失,内核会 # **拒绝启动**(不静默回退到磁盘密钥)。若要用磁盘密钥路径,删掉下面这行。 # -# ⚠ 从旧版(/var/lib/homeagent/security.key 磁盘钥)升级时: +# ⚠ 从旧版(/var/lib/homeagent/security.key,改名前的路径)升级时: # 内核支持"磁盘钥 + 内嵌钥"并存解密(AdditionalDecryptKeys), -# 所以先放 /etc/homeagent/security.key 与旧磁盘钥**同一份内容**再启用本行, +# 所以先放 /etc/hologram/security.key 与旧磁盘钥**同一份内容**再启用本行, # 否则旧密文解不开。 -LoadCredential=homed_security_key:/etc/homeagent/security.key +LoadCredential=homed_security_key:/etc/hologram/security.key # Security hardening NoNewPrivileges=true @@ -97,9 +97,9 @@ PrivateTmp=true PrivateDevices=false DevicePolicy=closed # 只允许读主密钥所在目录,其余系统路径保持只读 -ReadOnlyPaths=/etc/homeagent +ReadOnlyPaths=/etc/hologram # 插件需要写自己目录 + 数据目录 + 插件沙箱 -ReadWritePaths=/var/lib/homeagent +ReadWritePaths=/var/lib/hologram # Audio devices DeviceAllow=/dev/snd rw DeviceAllow=/dev/dsp rw diff --git a/deploy/packaging/linux/homeagent.spec b/deploy/packaging/linux/hologramagent.spec similarity index 100% rename from deploy/packaging/linux/homeagent.spec rename to deploy/packaging/linux/hologramagent.spec diff --git a/deploy/systemd/embed-sidecar.service b/deploy/systemd/embed-sidecar.service index 49220bfb..ffe03497 100644 --- a/deploy/systemd/embed-sidecar.service +++ b/deploy/systemd/embed-sidecar.service @@ -1,5 +1,5 @@ [Unit] -Description=Jina v5-omni-nano Embedding Sidecar for HomeAgent +Description=Jina v5-omni-nano Embedding Sidecar for HologramAgent After=network.target [Service] From 503579ae182290471f626afc77e6120c43455d89 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Wed, 21 Oct 2026 13:21:00 +0800 Subject: [PATCH 2/4] =?UTF-8?q?refactor(deploy):=20deb=20control=20?= =?UTF-8?q?=E4=B8=8E=20postinst/prerm=20=E6=94=B9=E7=94=A8=20hologramagent?= =?UTF-8?q?=20=E5=8C=85=E5=90=8D=E4=B8=8E=20/var/lib/hologram?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 四个 control:Package: homeagent-{client,server,full,toolchain} → hologramagent-*,Maintainer/Homepage 品牌名,toolchain 的 SDK 安装路径 /usr/lib/homeagent/sdk → /usr/lib/hologram/sdk。 postinst/prerm:SERVICE_NAME="hologramagent"。 这一行是「改一半就静默失效」的典型: systemctl enable/start/stop 全部带 2>/dev/null || true, 单元名不对时**不报错**——装完既不 enable 也不 start,用户以为装好了。 现在 postinst 的 DATA_DIR/SETUP_SH 也一起指向 /var/lib/hologram、 /usr/lib/hologram/setup.sh,否则 setup.sh 会在旧目录里初始化凭据, 而内核按新单元从新目录读 —— 表现为「装完登录不上,credentials.txt 找不到」。 setup.sh 同步:HOLOGRAM_DATA / HOLOGRAM_API_KEY 前缀、模型目录 /usr/lib/hologram/models/...。与 postinst 传的变量名必须一致, 否则 DATA_DIR 回落到默认值、凭据写到另一个目录。 Homepage/Documentation 用 trueagent/HologramAgent(与原值同源,只换品牌词); 仓库 owner 与地址本身归批 4,这里不动。 --- deploy/packaging/linux/deb/control-client | 14 +++++++------- deploy/packaging/linux/deb/control-full | 12 ++++++------ deploy/packaging/linux/deb/control-server | 10 +++++----- deploy/packaging/linux/deb/control-toolchain | 14 +++++++------- deploy/packaging/linux/deb/postinst | 16 ++++++++-------- deploy/packaging/linux/deb/prerm | 2 +- deploy/packaging/linux/setup.sh | 14 +++++++------- 7 files changed, 41 insertions(+), 41 deletions(-) diff --git a/deploy/packaging/linux/deb/control-client b/deploy/packaging/linux/deb/control-client index 93621199..55ce67f2 100644 --- a/deploy/packaging/linux/deb/control-client +++ b/deploy/packaging/linux/deb/control-client @@ -1,18 +1,18 @@ -Package: homeagent-client +Package: hologramagent-client Version: VERSION_PLACEHOLDER Architecture: ARCH_PLACEHOLDER -Maintainer: HomeAgent Team +Maintainer: HologramAgent Team Installed-Size: INSTALLED_SIZE_PLACEHOLDER Depends: libc6 (>= 2.28) Section: utils Priority: optional -Homepage: https://github.com/trueagent/HomeAgent -Description: HomeAgent Client (CLI + GUI, no daemon) - HomeAgent is a personal AI home assistant that integrates +Homepage: https://github.com/trueagent/HologramAgent +Description: HologramAgent Client (CLI + GUI, no daemon) + HologramAgent is a personal AI home assistant that integrates large language models with system automation. . This package includes the client components: - waiter: command-line client - - homeagent-gui: desktop graphical interface + - hologram-gui: desktop graphical interface . - This variant connects to a remote HomeAgent server. + This variant connects to a remote HologramAgent server. diff --git a/deploy/packaging/linux/deb/control-full b/deploy/packaging/linux/deb/control-full index cc1d4877..534e6303 100644 --- a/deploy/packaging/linux/deb/control-full +++ b/deploy/packaging/linux/deb/control-full @@ -1,17 +1,17 @@ -Package: homeagent-full +Package: hologramagent-full Version: VERSION_PLACEHOLDER Architecture: ARCH_PLACEHOLDER -Maintainer: HomeAgent Team +Maintainer: HologramAgent Team Installed-Size: INSTALLED_SIZE_PLACEHOLDER Depends: libc6 (>= 2.28), libstdc++6, libgcc-s1 Section: utils Priority: optional -Homepage: https://github.com/trueagent/HomeAgent -Description: HomeAgent Full Installation (Daemon + CLI + GUI) - HomeAgent is a personal AI home assistant that integrates +Homepage: https://github.com/trueagent/HologramAgent +Description: HologramAgent Full Installation (Daemon + CLI + GUI) + HologramAgent is a personal AI home assistant that integrates large language models with system automation. . This package includes the full suite: - homed: the core daemon (background service) - waiter: command-line client - - homeagent-gui: desktop graphical interface + - hologram-gui: desktop graphical interface diff --git a/deploy/packaging/linux/deb/control-server b/deploy/packaging/linux/deb/control-server index 00c4fac2..7e5f4c17 100644 --- a/deploy/packaging/linux/deb/control-server +++ b/deploy/packaging/linux/deb/control-server @@ -1,14 +1,14 @@ -Package: homeagent-server +Package: hologramagent-server Version: VERSION_PLACEHOLDER Architecture: ARCH_PLACEHOLDER -Maintainer: HomeAgent Team +Maintainer: HologramAgent Team Installed-Size: INSTALLED_SIZE_PLACEHOLDER Depends: libc6 (>= 2.28), libstdc++6, libgcc-s1 Section: utils Priority: optional -Homepage: https://github.com/trueagent/HomeAgent -Description: HomeAgent Server (Daemon + CLI, no GUI) - HomeAgent is a personal AI home assistant that integrates +Homepage: https://github.com/trueagent/HologramAgent +Description: HologramAgent Server (Daemon + CLI, no GUI) + HologramAgent is a personal AI home assistant that integrates large language models with system automation. . This package includes the server components: diff --git a/deploy/packaging/linux/deb/control-toolchain b/deploy/packaging/linux/deb/control-toolchain index 8f888449..305b57b3 100644 --- a/deploy/packaging/linux/deb/control-toolchain +++ b/deploy/packaging/linux/deb/control-toolchain @@ -1,14 +1,14 @@ -Package: homeagent-toolchain +Package: hologramagent-toolchain Version: VERSION_PLACEHOLDER Architecture: ARCH_PLACEHOLDER -Maintainer: HomeAgent Team +Maintainer: HologramAgent Team Installed-Size: INSTALLED_SIZE_PLACEHOLDER Depends: libc6 (>= 2.28), libstdc++6, libgcc-s1 Section: utils Priority: optional -Homepage: https://github.com/trueagent/HomeAgent -Description: HomeAgent Toolchain (Daemon + CLI + Plugin Toolchain + SDK) - HomeAgent is a personal AI home assistant that integrates +Homepage: https://github.com/trueagent/HologramAgent +Description: HologramAgent Toolchain (Daemon + CLI + Plugin Toolchain + SDK) + HologramAgent is a personal AI home assistant that integrates large language models with system automation. . This package includes the full development toolchain: @@ -16,7 +16,7 @@ Description: HomeAgent Toolchain (Daemon + CLI + Plugin Toolchain + SDK) - depgraph.bin: kernel startup dependency graph (MUST sit next to homed) - waiter: command-line client - hmapdev: plugin build toolchain (init/build/package .hmap) - - the matching HomeAgent SDK (sdk/, tools/, skills/, meta/, docs/) + - the matching HologramAgent SDK (sdk/, tools/, skills/, meta/, docs/) . - Installs the SDK under /usr/lib/homeagent/sdk so that hmapdev can resolve + Installs the SDK under /usr/lib/hologram/sdk so that hmapdev can resolve plugins against a known-good SDK without network access. diff --git a/deploy/packaging/linux/deb/postinst b/deploy/packaging/linux/deb/postinst index 325853f3..14e3a860 100644 --- a/deploy/packaging/linux/deb/postinst +++ b/deploy/packaging/linux/deb/postinst @@ -1,10 +1,10 @@ #!/bin/sh set -e -SERVICE_NAME="homeagent" +SERVICE_NAME="hologramagent" HOMED_BIN="/usr/bin/homed" -DATA_DIR="/var/lib/homeagent" -SETUP_SH="/usr/lib/homeagent/setup.sh" +DATA_DIR="/var/lib/hologram" +SETUP_SH="/usr/lib/hologram/setup.sh" # unit 由本包装到 /etc/systemd/system/,而旧 postinst 只查 # /lib/systemd/system/(merged-usr 下等于 /usr/lib/systemd/system,那里没有 @@ -34,9 +34,9 @@ case "$1" in # credentials.txt、没进数据库),用户拿它登录必然失败,安装却一声不响。 # 失败必须看得见,并给出可直接执行的补救命令。 if [ -x "$SETUP_SH" ]; then - if ! HOMEAGENT_DATA="$DATA_DIR" "$SETUP_SH"; then - echo "E: homeagent 初始化失败——凭据可能未写入 config.db。" >&2 - echo "E: 请手动重试:HOMEAGENT_DATA=$DATA_DIR $SETUP_SH" >&2 + if ! HOLOGRAM_DATA="$DATA_DIR" "$SETUP_SH"; then + echo "E: hologramagent 初始化失败——凭据可能未写入 config.db。" >&2 + echo "E: 请手动重试:HOLOGRAM_DATA=$DATA_DIR $SETUP_SH" >&2 fi else echo "W: 未找到 $SETUP_SH,跳过凭据初始化。" >&2 @@ -51,10 +51,10 @@ case "$1" in # (仅 enable 不会让已在运行的进程换用新文件)。 if [ -z "${2:-}" ]; then systemctl start "$SERVICE_NAME" 2>/dev/null || \ - echo "W: homeagent 服务未能启动,请检查:systemctl status $SERVICE_NAME" >&2 + echo "W: hologramagent 服务未能启动,请检查:systemctl status $SERVICE_NAME" >&2 else systemctl restart "$SERVICE_NAME" 2>/dev/null || \ - echo "W: homeagent 服务未能重启,请检查:systemctl status $SERVICE_NAME" >&2 + echo "W: hologramagent 服务未能重启,请检查:systemctl status $SERVICE_NAME" >&2 fi else echo "W: 未找到 ${SERVICE_NAME}.service,未启用服务。" >&2 diff --git a/deploy/packaging/linux/deb/prerm b/deploy/packaging/linux/deb/prerm index 18f45466..e072bfc3 100644 --- a/deploy/packaging/linux/deb/prerm +++ b/deploy/packaging/linux/deb/prerm @@ -1,7 +1,7 @@ #!/bin/sh set -e -SERVICE_NAME="homeagent" +SERVICE_NAME="hologramagent" case "$1" in remove|deconfigure) diff --git a/deploy/packaging/linux/setup.sh b/deploy/packaging/linux/setup.sh index 2e0cc469..20d39d11 100644 --- a/deploy/packaging/linux/setup.sh +++ b/deploy/packaging/linux/setup.sh @@ -1,14 +1,14 @@ #!/usr/bin/env bash -# HomeAgent 首次初始化脚本 +# HologramAgent 首次初始化脚本 # 在安装后执行,生成凭据并初始化数据库 set -e -DATA_DIR="${HOMEAGENT_DATA:-/var/lib/homeagent}" +DATA_DIR="${HOLOGRAM_DATA:-/var/lib/hologram}" CRED_FILE="${DATA_DIR}/credentials.txt" CONFIG_DB="${DATA_DIR}/config.db" WAITER_CONF="${DATA_DIR}/waiter.yaml" INITCONFIG_BIN="/usr/bin/initconfig" -BUNDLED_MODEL_DIR="/usr/lib/homeagent/models/chinese-clip-vit-b16-onnx" +BUNDLED_MODEL_DIR="/usr/lib/hologram/models/chinese-clip-vit-b16-onnx" MODEL_LINK="${DATA_DIR}/models/chinese-clip-vit-b16-onnx" # 模型随 server/full 包安装到只读的 /usr/lib;配置默认仍指向 dataDir/models。 @@ -33,9 +33,9 @@ mkdir -p "$DATA_DIR" # 允许环境变量覆盖:安装器(包括 Windows 上的 WSL 引导安装)已经在界面上 # 向用户收过这些值,若不接受传入就只能两个地方各生成一份,用户看到的那份 # 与实际写入 config.db 的那份不一致——那种错会直接表现为「登录不上」。 -API_KEY="${HOMEAGENT_API_KEY:-$(cat /proc/sys/kernel/random/uuid 2>/dev/null | tr -d '-' || echo "homeagent$(date +%s)")}" +API_KEY="${HOLOGRAM_API_KEY:-$(cat /proc/sys/kernel/random/uuid 2>/dev/null | tr -d '-' || echo "hologram$(date +%s)")}" WEBUI_USER="${WEBUI_USER:-admin}" -WEBUI_PASS="${WEBUI_PASS:-$(openssl rand -hex 12 2>/dev/null || echo "homeagent")}" +WEBUI_PASS="${WEBUI_PASS:-$(openssl rand -hex 12 2>/dev/null || echo "hologram")}" # 初始化数据库 if [ -x "$INITCONFIG_BIN" ]; then @@ -49,7 +49,7 @@ fi # 保存凭据 cat > "$CRED_FILE" << CRED =================================== - HomeAgent 初始配置信息 + HologramAgent 初始配置信息 请妥善保管,安装后仅此一份 =================================== WebUI 地址: http://localhost:8080 @@ -74,6 +74,6 @@ WAITER echo "" echo "============================================" -echo " HomeAgent 初始化完成" +echo " HologramAgent 初始化完成" echo "============================================" cat "$CRED_FILE" From 79688386b1a0ad93a543004dc40d68b0da49e037 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Wed, 21 Oct 2026 13:21:06 +0800 Subject: [PATCH 3/4] =?UTF-8?q?refactor(deploy):=20package-linux.sh/spec?= =?UTF-8?q?=20=E4=BA=A7=E7=89=A9=E4=B8=8E=E5=AE=89=E8=A3=85=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=94=B9=E5=90=8D=EF=BC=8C=E5=B9=B6=E8=A1=A5=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E5=88=A4=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit package-linux.sh(只动包名/安装路径,不动 SDK module 路径): - 产物名 hologramagent-{variant}_*.deb / hologramagent-*.rpm / hologramagent_*.tar.gz - 安装路径 /usr/lib/hologram/{sdk,models,onnxruntime,setup.sh}、 /usr/share/doc/hologramagent/(DEP-5 惯例按包名) - GUI:build/hologram-gui-linux-、/usr/bin/hologram-gui、 /usr/lib/hologram-gui、hologram-gui.desktop - 单元从 deploy/hologramagent.service 取,装成 hologramagent.service - staging /var/lib/hologram **故意没动** prepare_gomod 里那段 replace 的匹配串 (github.com/JianFeeeee/homeagentsdk):那是批 3 的 module 改名, 匹配串先改而 module 未改,sed 会整段不匹配且**不报错**,继续用旧路径编 —— 正是清单第四节第 2 条点名的静默失效。等批 3 一起改才安全。 spec:homeagent.spec → hologramagent.spec(git mv),包名/unit/datadir/ changelog 同步;%{_varlibdir} = /var/lib/hologram。 packaging_test.go:第 171 行的 toolchain 关键字跟着改;**第 99-106 行那两处 module 路径断言一行未动**(批 1 的地盘)。另新增四条结构判据,把本批 「日志全绿但包内容还是旧路径」这一类钉住: · TestPackagingUsesRenamedInstallPaths —— 脚本里不许残留旧路径,且新值必须真出现 · TestDebMaintainerScriptsUseRenamedService —— postinst/prerm 的 SERVICE_NAME · TestDebControlFilesUseRenamedPackage —— 四个 control 的 Package 与 SDK 路径 · TestSystemdUnitUsesRenamedPaths —— 单元指令行(注释除外)+ 旧单元已删 判据形态仍沿用本文件的原则:断言的是「某个必需处置存在」,不是接线/顺序。 端到端(真装再看内核)由发版流程做。 --- deploy/packaging/linux/hologramagent.spec | 46 +++---- deploy/packaging/package-linux.sh | 106 ++++++++-------- deploy/packaging/packaging_test.go | 143 +++++++++++++++++++++- 3 files changed, 218 insertions(+), 77 deletions(-) diff --git a/deploy/packaging/linux/hologramagent.spec b/deploy/packaging/linux/hologramagent.spec index 476f3843..fdddf0c6 100644 --- a/deploy/packaging/linux/hologramagent.spec +++ b/deploy/packaging/linux/hologramagent.spec @@ -1,27 +1,27 @@ -# HomeAgent RPM Spec -# Build: rpmbuild -ba homeagent.spec +# HologramAgent RPM Spec +# Build: rpmbuild -ba hologramagent.spec # # Define variant at build time: -# rpmbuild -ba --define "variant full" homeagent.spec -# rpmbuild -ba --define "variant server" homeagent.spec -# rpmbuild -ba --define "variant client" homeagent.spec +# rpmbuild -ba --define "variant full" hologramagent.spec +# rpmbuild -ba --define "variant server" hologramagent.spec +# rpmbuild -ba --define "variant client" hologramagent.spec %define _prefix /usr %define _bindir %{_prefix}/bin %define _unitdir %{_prefix}/lib/systemd/system -%define _datadir %{_prefix}/share/homeagent -%define _varlibdir /var/lib/homeagent +%define _datadir %{_prefix}/share/hologramagent +%define _varlibdir /var/lib/hologram %if %{undefined variant} %define variant full %endif -Name: homeagent-%{variant} +Name: hologramagent-%{variant} Version: %{_version} Release: 1%{?dist} -Summary: HomeAgent - Personal AI Home Assistant +Summary: HologramAgent - Personal AI Home Assistant License: Proprietary -URL: https://github.com/trueagent/HomeAgent +URL: https://github.com/trueagent/HologramAgent Group: System Environment/Daemons BuildArch: %{_arch} @@ -36,19 +36,19 @@ Requires: libX11, libxcb, libdrm, mesa-libGL, nss, nspr, atk, at-spi2-atk, cairo %endif %description -HomeAgent is a personal AI home assistant that integrates large language +HologramAgent is a personal AI home assistant that integrates large language models with system automation. %if "%{variant}" == "full" This package includes the full suite: homed (daemon), waiter (CLI), -and homeagent-gui (desktop GUI). +and hologram-gui (desktop GUI). %else %if "%{variant}" == "server" This package includes the server components: homed (daemon) and waiter (CLI). %else %if "%{variant}" == "client" This package includes the client components: waiter (CLI) and -homeagent-gui (desktop GUI). Connects to a remote HomeAgent server. +hologram-gui (desktop GUI). Connects to a remote HologramAgent server. %endif %endif %endif @@ -60,7 +60,7 @@ mkdir -p %{buildroot}%{_varlibdir} %if "%{variant}" == "full" || "%{variant}" == "server" install -m 755 %{_sourcedir}/homed %{buildroot}%{_bindir}/homed -install -m 644 %{_sourcedir}/homeagent.service %{buildroot}%{_unitdir}/homeagent.service +install -m 644 %{_sourcedir}/hologramagent.service %{buildroot}%{_unitdir}/hologramagent.service %endif # waiter 三个变体都要:server 也含 CLI(对齐 deb 的 stage_variant @@ -68,8 +68,8 @@ install -m 644 %{_sourcedir}/homeagent.service %{buildroot}%{_unitdir}/homeagent install -m 755 %{_sourcedir}/waiter %{buildroot}%{_bindir}/waiter %if "%{variant}" == "full" || "%{variant}" == "client" -mkdir -p %{buildroot}%{_datadir}/homeagent-gui -cp -r %{_sourcedir}/homeagent-gui-linux-*/* %{buildroot}%{_datadir}/homeagent-gui/ +mkdir -p %{buildroot}%{_datadir}/hologram-gui +cp -r %{_sourcedir}/hologram-gui-linux-*/* %{buildroot}%{_datadir}/hologram-gui/ %endif %files @@ -77,33 +77,33 @@ cp -r %{_sourcedir}/homeagent-gui-linux-*/* %{buildroot}%{_datadir}/homeagent-gu %if "%{variant}" == "full" || "%{variant}" == "server" %{_bindir}/homed -%{_unitdir}/homeagent.service +%{_unitdir}/hologramagent.service %dir %{_varlibdir} %endif %{_bindir}/waiter %if "%{variant}" == "full" || "%{variant}" == "client" -%dir %{_datadir}/homeagent-gui -%{_datadir}/homeagent-gui/* +%dir %{_datadir}/hologram-gui +%{_datadir}/hologram-gui/* %endif %post %if "%{variant}" == "full" || "%{variant}" == "server" mkdir -p %{_varlibdir} -%systemd_post homeagent.service +%systemd_post hologramagent.service %endif %preun %if "%{variant}" == "full" || "%{variant}" == "server" -%systemd_preun homeagent.service +%systemd_preun hologramagent.service %endif %postun %if "%{variant}" == "full" || "%{variant}" == "server" -%systemd_postun_with_restart homeagent.service +%systemd_postun_with_restart hologramagent.service %endif %changelog -* Mon Jul 20 2026 HomeAgent Team - %{version}-1 +* Mon Jul 20 2026 HologramAgent Team - %{version}-1 - Initial Linux packaging diff --git a/deploy/packaging/package-linux.sh b/deploy/packaging/package-linux.sh index 14fcfa8d..c4f205cd 100644 --- a/deploy/packaging/package-linux.sh +++ b/deploy/packaging/package-linux.sh @@ -86,7 +86,7 @@ case "$ARCH" in *) echo "Unknown arch: $ARCH (use amd64 or arm64)"; exit 1 ;; esac -echo "=== HomeAgent Linux Packager ===" +echo "=== HologramAgent Linux Packager ===" echo "Version: $VERSION" [ "$PKG_VERSION" = "$VERSION" ] || echo "Package: $PKG_VERSION (normalized for deb/rpm)" echo "Arch: $ARCH" @@ -198,7 +198,7 @@ build_go() { # 一道强制校验:架构不符就删掉目录并跳过 GUI,宁可不发也不发坏包。 build_gui() { local gui_dir="$PROJECT_ROOT/cmd/gui" - local gui_out="$BUILD_DIR/homeagent-gui-linux-${TAR_ARCH}" + local gui_out="$BUILD_DIR/hologram-gui-linux-${TAR_ARCH}" if [ -d "$gui_out" ]; then echo ">>> GUI already built at $gui_out (delete to rebuild)" @@ -343,11 +343,11 @@ print(m.group(1) if m else '') fi # create desktop entry and symlink - cat > "$gui_out/resources/app/homeagent-gui.desktop" << DESKTOP + cat > "$gui_out/resources/app/hologram-gui.desktop" << DESKTOP [Desktop Entry] -Name=HomeAgent -Comment=HomeAgent Desktop GUI -Exec=$gui_out/homeagent-gui +Name=HologramAgent +Comment=HologramAgent Desktop GUI +Exec=$gui_out/hologram-gui Terminal=false Type=Application Categories=Utility; @@ -355,12 +355,12 @@ Icon=$gui_out/resources/app/icon.svg DESKTOP # create launcher script - cat > "$gui_out/homeagent-gui" << 'LAUNCHER' + cat > "$gui_out/hologram-gui" << 'LAUNCHER' #!/bin/sh DIR="$(cd "$(dirname "$0")" && pwd)" exec "$DIR/electron" "$DIR/resources/app" "$@" LAUNCHER - chmod +x "$gui_out/homeagent-gui" + chmod +x "$gui_out/hologram-gui" chmod +x "$gui_out/electron" # 最后一道强制校验:electron 二进制的实际架构必须匹配目标架构。 @@ -398,7 +398,7 @@ stage_variant() { mkdir -p "$staging/usr/bin" mkdir -p "$staging/etc/systemd/system" - mkdir -p "$staging/var/lib/homeagent" + mkdir -p "$staging/var/lib/hologram" local initconfig_bin="$BUILD_DIR/initconfig_$suffix" @@ -457,7 +457,7 @@ stage_variant() { stage_sdk() { local staging="$1" local sdk_src="$PROJECT_ROOT/third_party/homeagent-sdk" - local sdk_dst="$staging/usr/lib/homeagent/sdk" + local sdk_dst="$staging/usr/lib/hologram/sdk" [ -d "$sdk_src" ] || { echo "ERROR: 找不到 SDK 源码 $sdk_src" >&2; return 1; } mkdir -p "$sdk_dst" for item in go.mod go.sum LICENSE README.md sdk meta tools skills; do @@ -475,7 +475,7 @@ stage_variant() { cp "$BUILD_DIR/homed_$suffix" "$staging/usr/bin/homed" cp "$BUILD_DIR/waiter_$suffix" "$staging/usr/bin/waiter" stage_depgraph "$staging" - cp "$PROJECT_ROOT/deploy/homeagent.service" "$staging/etc/systemd/system/homeagent.service" + cp "$PROJECT_ROOT/deploy/hologramagent.service" "$staging/etc/systemd/system/hologramagent.service" [ -f "$initconfig_bin" ] && cp "$initconfig_bin" "$staging/usr/bin/initconfig" stage_setup "$staging" stage_license "$staging" @@ -486,7 +486,7 @@ stage_variant() { cp "$BUILD_DIR/homed_$suffix" "$staging/usr/bin/homed" cp "$BUILD_DIR/waiter_$suffix" "$staging/usr/bin/waiter" stage_depgraph "$staging" - cp "$PROJECT_ROOT/deploy/homeagent.service" "$staging/etc/systemd/system/homeagent.service" + cp "$PROJECT_ROOT/deploy/hologramagent.service" "$staging/etc/systemd/system/hologramagent.service" [ -f "$initconfig_bin" ] && cp "$initconfig_bin" "$staging/usr/bin/initconfig" stage_setup "$staging" stage_license "$staging" @@ -499,7 +499,7 @@ stage_variant() { stage_depgraph "$staging" stage_hmapdev "$staging" stage_sdk "$staging" - cp "$PROJECT_ROOT/deploy/homeagent.service" "$staging/etc/systemd/system/homeagent.service" + cp "$PROJECT_ROOT/deploy/hologramagent.service" "$staging/etc/systemd/system/hologramagent.service" [ -f "$initconfig_bin" ] && cp "$initconfig_bin" "$staging/usr/bin/initconfig" stage_setup "$staging" stage_license "$staging" @@ -520,15 +520,15 @@ stage_variant() { stage_gui() { local staging="$1" - local gui_src="$BUILD_DIR/homeagent-gui-linux-${TAR_ARCH}" + local gui_src="$BUILD_DIR/hologram-gui-linux-${TAR_ARCH}" if [ -d "$gui_src" ]; then - mkdir -p "$staging/usr/lib/homeagent-gui" - cp -r "$gui_src"/* "$staging/usr/lib/homeagent-gui/" - cat > "$staging/usr/bin/homeagent-gui" << 'SCRIPT' + mkdir -p "$staging/usr/lib/hologram-gui" + cp -r "$gui_src"/* "$staging/usr/lib/hologram-gui/" + cat > "$staging/usr/bin/hologram-gui" << 'SCRIPT' #!/bin/sh -exec /usr/lib/homeagent-gui/homeagent-gui "$@" +exec /usr/lib/hologram-gui/hologram-gui "$@" SCRIPT - chmod 755 "$staging/usr/bin/homeagent-gui" + chmod 755 "$staging/usr/bin/hologram-gui" else echo " WARNING: GUI not built, skipping GUI staging" fi @@ -538,30 +538,30 @@ stage_setup() { local staging="$1" local setup_src="$PROJECT_ROOT/deploy/packaging/linux/setup.sh" if [ -f "$setup_src" ]; then - mkdir -p "$staging/usr/lib/homeagent" - cp "$setup_src" "$staging/usr/lib/homeagent/setup.sh" - chmod 755 "$staging/usr/lib/homeagent/setup.sh" + mkdir -p "$staging/usr/lib/hologram" + cp "$setup_src" "$staging/usr/lib/hologram/setup.sh" + chmod 755 "$staging/usr/lib/hologram/setup.sh" fi } # 项目自身的许可:**所有变体**都要带(client 也分发 waiter 与 GUI)。 # -# deb 按 Debian 惯例给 /usr/share/doc/homeagent/copyright(DEP-5 机器可读格式), +# deb 按 Debian 惯例给 /usr/share/doc/hologramagent/copyright(DEP-5 机器可读格式), # 同时把 LICENSE 全文放进去;rpm 的许可走 fpm 的 --license 元数据。 # 与 stage_multimodal_assets 的 licenses/ 分工:那里放**第三方**(模型/运行库)的 # 许可全文,这里放本项目自己的。 stage_license() { local staging="$1" - local docdir="$staging/usr/share/doc/homeagent" + local docdir="$staging/usr/share/doc/hologramagent" mkdir -p "$docdir" cp "$PROJECT_ROOT/LICENSE" "$docdir/LICENSE" cat > "$docdir/copyright" <<'EOF' Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: HomeAgent -Source: https://github.com/JianFeeeee/HomeAgent +Upstream-Name: HologramAgent +Source: https://github.com/JianFeeeee/HologramAgent Files: * -Copyright: HomeAgent contributors +Copyright: HologramAgent contributors License: AGPL-3.0-only This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free @@ -579,18 +579,18 @@ License: AGPL-3.0-only clause (§13 Remote Network Interaction) — offering modified versions of this software to users over a network also requires offering them the source. . - Full text: /usr/share/doc/homeagent/LICENSE + Full text: /usr/share/doc/hologramagent/LICENSE -Files: usr/lib/homeagent/models/chinese-clip-vit-b16-onnx/* +Files: usr/lib/hologram/models/chinese-clip-vit-b16-onnx/* Copyright: OFA-Sys / Chinese-CLIP authors License: Apache-2.0 - Full text: /usr/share/doc/homeagent/licenses/Chinese-CLIP-Apache-2.0.txt + Full text: /usr/share/doc/hologramagent/licenses/Chinese-CLIP-Apache-2.0.txt Comment: pre-trained model artifacts; NOT covered by this package's AGPL grant -Files: usr/lib/homeagent/onnxruntime/* +Files: usr/lib/hologram/onnxruntime/* Copyright: Microsoft Corporation License: MIT - Full text: /usr/share/doc/homeagent/licenses/ONNX-Runtime-MIT.txt + Full text: /usr/share/doc/hologramagent/licenses/ONNX-Runtime-MIT.txt Comment: license texts and third-party notices under licenses/ONNX-Runtime-* EOF chmod 644 "$docdir/LICENSE" "$docdir/copyright" @@ -600,9 +600,9 @@ EOF # 只要打 server/full 包,两者缺一就失败。client 包不运行 homed,故不携带。 stage_multimodal_assets() { local staging="$1" - local model_dst="$staging/usr/lib/homeagent/models/chinese-clip-vit-b16-onnx" - local ort_dst="$staging/usr/lib/homeagent/onnxruntime" - local licenses="$staging/usr/share/doc/homeagent/licenses" + local model_dst="$staging/usr/lib/hologram/models/chinese-clip-vit-b16-onnx" + local ort_dst="$staging/usr/lib/hologram/onnxruntime" + local licenses="$staging/usr/share/doc/hologramagent/licenses" if [ ! -d "$CHINESECLIP_BUNDLE_DIR" ]; then echo "ERROR: Chinese-CLIP 产物目录不存在:$CHINESECLIP_BUNDLE_DIR" >&2 @@ -672,7 +672,7 @@ build_deb() { local deb_dir="${DIST_DIR}/deb" mkdir -p "$deb_dir" - local pkg_name="homeagent-${variant}_${PKG_VERSION}_${DEB_ARCH}.deb" + local pkg_name="hologramagent-${variant}_${PKG_VERSION}_${DEB_ARCH}.deb" local deb_root deb_root="$(mktemp -d "$STAGE_TMP/deb.XXXXXX")" @@ -711,13 +711,13 @@ build_tar() { local tar_dir="${DIST_DIR}/tar" mkdir -p "$tar_dir" - local archive_name="homeagent_${PKG_VERSION}_linux_${TAR_ARCH}.tar.gz" - local archive_dir="homeagent-${PKG_VERSION}-linux-${TAR_ARCH}" + local archive_name="hologramagent_${PKG_VERSION}_linux_${TAR_ARCH}.tar.gz" + local archive_dir="hologramagent-${PKG_VERSION}-linux-${TAR_ARCH}" # build combined staging local staging staging="$(mktemp -d "$STAGE_TMP/tar.XXXXXX")" - mkdir -p "$staging/usr/bin" "$staging/usr/lib/homeagent" "$staging/etc/systemd/system" + mkdir -p "$staging/usr/bin" "$staging/usr/lib/hologram" "$staging/etc/systemd/system" # copy all available binaries for bin in homed waiter initconfig; do @@ -727,21 +727,21 @@ build_tar() { # setup script local setup_src="$PROJECT_ROOT/deploy/packaging/linux/setup.sh" - [ -f "$setup_src" ] && cp "$setup_src" "$staging/usr/lib/homeagent/setup.sh" - cp "$PROJECT_ROOT/deploy/homeagent.service" "$staging/etc/systemd/system/homeagent.service" + [ -f "$setup_src" ] && cp "$setup_src" "$staging/usr/lib/hologram/setup.sh" + cp "$PROJECT_ROOT/deploy/hologramagent.service" "$staging/etc/systemd/system/hologramagent.service" stage_license "$staging" stage_multimodal_assets "$staging" # GUI if available - local gui_src="$BUILD_DIR/homeagent-gui-linux-${TAR_ARCH}" + local gui_src="$BUILD_DIR/hologram-gui-linux-${TAR_ARCH}" if [ -d "$gui_src" ]; then - mkdir -p "$staging/usr/lib/homeagent-gui" - cp -r "$gui_src"/* "$staging/usr/lib/homeagent-gui/" - cat > "$staging/usr/bin/homeagent-gui" << 'SCRIPT' + mkdir -p "$staging/usr/lib/hologram-gui" + cp -r "$gui_src"/* "$staging/usr/lib/hologram-gui/" + cat > "$staging/usr/bin/hologram-gui" << 'SCRIPT' #!/bin/sh -exec /usr/lib/homeagent-gui/homeagent-gui "$@" +exec /usr/lib/hologram-gui/hologram-gui "$@" SCRIPT - chmod 755 "$staging/usr/bin/homeagent-gui" + chmod 755 "$staging/usr/bin/hologram-gui" fi chmod 755 "$staging/usr/bin/"* 2>/dev/null || true @@ -759,7 +759,7 @@ build_rpm() { local rpm_dir="${DIST_DIR}/rpm" mkdir -p "$rpm_dir" - local pkg_name="homeagent-${variant}-${PKG_VERSION}-1.${RPM_ARCH}.rpm" + local pkg_name="hologramagent-${variant}-${PKG_VERSION}-1.${RPM_ARCH}.rpm" # find fpm local fpm_bin="$(command -v fpm 2>/dev/null || true)" @@ -770,7 +770,7 @@ build_rpm() { if [ -z "$fpm_bin" ]; then echo " SKIP .rpm: fpm not installed. Install it with: gem install fpm" echo " Alternatively, build RPM on Fedora/RHEL using:" - echo " rpmbuild -ba deploy/packaging/linux/homeagent.spec" + echo " rpmbuild -ba deploy/packaging/linux/hologramagent.spec" return fi @@ -804,12 +804,12 @@ build_rpm() { echo ">>> Building .rpm via fpm: $pkg_name" "$fpm_bin" -s dir -t rpm \ - -n "homeagent-${variant}" \ + -n "hologramagent-${variant}" \ -v "$VERSION" \ --iteration 1 \ -a "$RPM_ARCH" \ - --description "HomeAgent ${variant^} package" \ - --url "https://github.com/trueagent/HomeAgent" \ + --description "HologramAgent ${variant^} package" \ + --url "https://github.com/trueagent/HologramAgent" \ --license "AGPL-3.0-only" \ -C "$staging" \ -p "$rpm_dir/$pkg_name" \ @@ -874,7 +874,7 @@ main() { # 只列**本批**产物:dist/ 会跨多次构建累积,用 find 全目录会让清单/SHA256SUMS # 带上历史版本的文件名——用户下载那种清单后 `sha256sum -c` 必然报缺失。 # (v1.2.2 构建时就出现过:清单里混进了 1.2.0/1.2.1 的包名。)按本批版本号过滤。 - mapfile -t release_files < <(find "$DIST_DIR" -type f \( -name "*${PKG_VERSION}*.deb" -o -name "homeagent_${PKG_VERSION}_*.tar.gz" -o -name "*${PKG_VERSION}*.rpm" \) 2>/dev/null | sort) + mapfile -t release_files < <(find "$DIST_DIR" -type f \( -name "*${PKG_VERSION}*.deb" -o -name "hologramagent_${PKG_VERSION}_*.tar.gz" -o -name "*${PKG_VERSION}*.rpm" \) 2>/dev/null | sort) for f in "${release_files[@]}"; do echo " $(du -h "$f" | cut -f1) $f" done diff --git a/deploy/packaging/packaging_test.go b/deploy/packaging/packaging_test.go index 0b5b06fc..e9df897e 100644 --- a/deploy/packaging/packaging_test.go +++ b/deploy/packaging/packaging_test.go @@ -168,9 +168,150 @@ func TestToolchainVariantHasControlFile(t *testing.T) { t.Fatal("★ 缺 control-toolchain —— toolchain 变体打不出来") } c := string(b) - for _, kw := range []string{"homeagent-toolchain", "hmapdev", "SDK", "depgraph"} { + for _, kw := range []string{"hologramagent-toolchain", "hmapdev", "SDK", "depgraph"} { if !strings.Contains(c, kw) { t.Errorf("control-toolchain 的描述里应提到 %s(让 apt show 能说清装了什么)", kw) } } } + +// ★★★ 判据:打包产物里的**安装路径与单元名**必须已随品牌改名(批 2)。 +// +// 这条守的是"改一半就静默失效"那一类:包能打出来、退出码 0,但内容里 +// 还写着旧路径 —— 装上去之后 systemd 找不到单元、数据目录对不上、 +// ONNX 运行库指向空目录,而且没有任何一步报错。 +// +// 只扫**产物布局相关**的旧串,不扫 module 路径(那是批 1 的地盘, +// 见 TestPackagingLdflagsUseCurrentModulePath)。 +func TestPackagingUsesRenamedInstallPaths(t *testing.T) { + src := readOrSkip(t, pkgLinux) + + // 安装路径 / 单元文件:一个都不许留旧值。 + for _, stale := range []string{ + "/var/lib/homeagent", + "/usr/lib/homeagent", + "/usr/share/doc/homeagent", + "deploy/homeagent.service", + "/etc/systemd/system/homeagent.service", + "/usr/bin/homeagent-gui", + "/usr/lib/homeagent-gui", + `pkg_name="homeagent-`, + } { + if strings.Contains(src, stale) { + t.Errorf("★ package-linux.sh 仍含旧安装路径/包名 %q —— "+ + "打出的包会装到旧位置(日志全绿,装完路径对不上)", stale) + } + } + + // 新值必须真的出现(否则上面的"无旧值"可能只是整段被删了)。 + for _, want := range []string{ + "/var/lib/hologram", + "/usr/lib/hologram", + "/usr/share/doc/hologramagent", + "deploy/hologramagent.service", + "/etc/systemd/system/hologramagent.service", + "/usr/bin/hologram-gui", + "/usr/lib/hologram-gui", + `pkg_name="hologramagent-`, + } { + if !strings.Contains(src, want) { + t.Errorf("★ package-linux.sh 缺少 %q —— 改名没落到位", want) + } + } +} + +// ★★★ 判据:deb 的 postinst / prerm 必须操作**新**单元名。 +// +// postinst 的 SERVICE_NAME 若还是旧名,装完 systemctl enable 找不到单元: +// 它带 `|| true`,所以一声不响地什么也没启用 —— 装完不会开机自启。 +func TestDebMaintainerScriptsUseRenamedService(t *testing.T) { + for _, p := range []string{ + "../../deploy/packaging/linux/deb/postinst", + "../../deploy/packaging/linux/deb/prerm", + } { + b, err := os.ReadFile(p) + if err != nil { + t.Skipf("读不到 %s: %v", p, err) + } + s := string(b) + if !strings.Contains(s, `SERVICE_NAME="hologramagent"`) { + t.Errorf("★ %s 的 SERVICE_NAME 不是 hologramagent —— "+ + "systemctl enable/stop 会作用在不存在的单元上(|| true 吞掉失败)", p) + } + if strings.Contains(s, `SERVICE_NAME="homeagent"`) { + t.Errorf("★ %s 仍用旧 SERVICE_NAME=homeagent", p) + } + if strings.Contains(s, "/var/lib/homeagent") || strings.Contains(s, "/usr/lib/homeagent") { + t.Errorf("★ %s 仍含旧安装路径", p) + } + } +} + +// ★★★ 判据:四个 deb control 的包名与 SDK 安装路径必须已改。 +// +// `dpkg-deb -f Package` 的输出就是这里的 Package 字段; +// 旧名会让 apt 认为是另一个包(升级路径直接断成"装了第二个包")。 +func TestDebControlFilesUseRenamedPackage(t *testing.T) { + for _, variant := range []string{"client", "server", "full", "toolchain"} { + p := "../../deploy/packaging/linux/deb/control-" + variant + b, err := os.ReadFile(p) + if err != nil { + t.Fatalf("读不到 %s: %v", p, err) + } + s := string(b) + want := "Package: hologramagent-" + variant + "\n" + if !strings.Contains(s, want) { + t.Errorf("★ %s 缺少 %q", p, strings.TrimSpace(want)) + } + if strings.Contains(s, "Package: homeagent-") { + t.Errorf("★ %s 的 Package 仍是旧的 homeagent-*", p) + } + if strings.Contains(s, "/usr/lib/homeagent") { + t.Errorf("★ %s 的 SDK 安装路径仍是 /usr/lib/homeagent", p) + } + } + if b, err := os.ReadFile("../../deploy/packaging/linux/deb/control-toolchain"); err == nil { + if !strings.Contains(string(b), "/usr/lib/hologram/sdk") { + t.Error("★ control-toolchain 没把 SDK 装到 /usr/lib/hologram/sdk") + } + } +} + +// ★★★ 判据:systemd 单元文件本身(deploy/hologramagent.service)。 +// +// 文件名改了、内容没改是最典型的一半:ExecStart 仍写旧数据目录, +// 于是 StateDirectory / ReadWritePaths 与实际 --data 不一致, +// 内核起得来但写到只读路径上(或反之)—— 取决于 sandbox 设置,难查。 +func TestSystemdUnitUsesRenamedPaths(t *testing.T) { + b, err := os.ReadFile("../../deploy/hologramagent.service") + if err != nil { + t.Fatalf("★ 缺 deploy/hologramagent.service: %v", err) + } + s := string(b) + for _, want := range []string{ + "--data /var/lib/hologram", + "WorkingDirectory=/var/lib/hologram", + "StateDirectory=hologram", + "ReadWritePaths=/var/lib/hologram", + "ReadOnlyPaths=/etc/hologram", + "ONNXRUNTIME_DIR=/usr/lib/hologram/onnxruntime", + "LoadCredential=homed_security_key:/etc/hologram/security.key", + } { + if !strings.Contains(s, want) { + t.Errorf("★ hologramagent.service 缺 %q", want) + } + } + // 注释里可以留旧路径(升级说明),但**指令行**不能有。 + for _, line := range strings.Split(s, "\n") { + trimmed := strings.TrimSpace(line) + if trimmed == "" || strings.HasPrefix(trimmed, "#") { + continue + } + if strings.Contains(trimmed, "/var/lib/homeagent") || strings.Contains(trimmed, "/usr/lib/homeagent") { + t.Errorf("★ hologramagent.service 指令行仍含旧路径: %s", trimmed) + } + } + if _, err := os.Stat("../../deploy/homeagent.service"); err == nil { + t.Error("★ deploy/homeagent.service 仍然存在 —— 旧单元文件没删,两个单元会打架") + } +} From 67d0d9088811a9982d61a249629498985b35f6b6 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Wed, 21 Oct 2026 13:21:12 +0800 Subject: [PATCH 4/4] =?UTF-8?q?refactor(deploy):=20Windows=20=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E5=99=A8=E4=B8=8E=20WSL=20=E5=BC=95=E5=AF=BC=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E6=94=B9=E5=90=8D=EF=BC=8C=E5=B9=B6=E4=BF=AE=E4=B8=A4?= =?UTF-8?q?=E5=A4=84=E8=B7=A8=E8=84=9A=E6=9C=AC=E4=B8=8D=E5=90=8C=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit installer.nsi / install-via-wsl.ps1:产品名、输出名 HologramAgent_v*_win64.exe、GUI 目录 hologram-gui-win32-x64、快捷方式、 自启注册表项、HOMEAGENT_* → HOLOGRAM_*(安装器写、setup.sh 读,必须同改)、 WSL 内数据目录 /var/lib/hologram 与 hologramagent.service。 package-windows.sh 两处顺带修: 1. GUI payload 目录名**不假设上游已改名**。它由 Makefile:331 (GUI_BINARY=homeagent-gui)或 build.sh 的 electron-builder (productName=HomeAgent)产出,两者都归别的批;而 .nsi 现在期望 hologram-gui-win32-x64。直接改引用会让 Windows 包以 "[FAIL] 需要 GUI payload" 挂掉(或者更糟:有人放宽检查,安装器 File 一个不存在的目录)。改成找到哪个用哪个、统一 stage 成 .nsi 期望名。 2. 版本号解析与 package-linux.sh/build.sh 同源。原先直接 `git describe --tags`,无 tag 分支上拿到的是分支名,于是拼出的 DEB_GLOB 永远找不到包 —— 报错信息看起来像"Linux 包没打出来", 真因是版本号被解析成分支名。现改为「形如 vX.Y.Z 才采用,否则回退 meta.Version」,并加数字开头守卫。 deploy/scripts/deploy.sh:单元文件名与 systemctl 提示改成 hologramagent。 (deploy-plan.sh 不动:它的 SVC 指的是**本机正在跑的那个**旧单元, 归部署 runbook;deploy-sdk-site.sh 的域名归批 5;upload_assets.py 的 仓库名归批 4。) --- deploy/packaging/installer.nsi | 70 +++++++++---------- deploy/packaging/package-windows.sh | 71 ++++++++++++++++++-- deploy/packaging/windows/install-via-wsl.ps1 | 60 ++++++++--------- deploy/scripts/deploy.sh | 14 ++-- 4 files changed, 136 insertions(+), 79 deletions(-) diff --git a/deploy/packaging/installer.nsi b/deploy/packaging/installer.nsi index b4139e9b..5011de6b 100644 --- a/deploy/packaging/installer.nsi +++ b/deploy/packaging/installer.nsi @@ -8,8 +8,8 @@ !define VARIANT "full" !endif -!define PRODUCT_NAME "HomeAgent" -!define PRODUCT_PUBLISHER "HomeAgent Team" +!define PRODUCT_NAME "HologramAgent" +!define PRODUCT_PUBLISHER "HologramAgent Team" # 版本号由 makensis -DPRODUCT_VERSION=X.Y.Z 注入;缺省值仅供本地手工构建。 # 此前硬编码 0.8.0 而 release 已到 1.0.0,装出来的包在「添加/删除程序」里 # 会显示错误版本(DisplayVersion 也取自这个宏)。 @@ -18,22 +18,22 @@ !endif !if "${VARIANT}" == "full" - !define PRODUCT_DISPLAY_NAME "HomeAgent 完整版" - !define OUTPUT_FILE "HomeAgent_v${PRODUCT_VERSION}_Full_win64.exe" + !define PRODUCT_DISPLAY_NAME "HologramAgent 完整版" + !define OUTPUT_FILE "HologramAgent_v${PRODUCT_VERSION}_Full_win64.exe" !define HAS_CORE 1 !define HAS_WAITER 1 !define HAS_GUI 1 !define HAS_CREDENTIALS 1 !else if "${VARIANT}" == "server" - !define PRODUCT_DISPLAY_NAME "HomeAgent 服务端" - !define OUTPUT_FILE "HomeAgent_v${PRODUCT_VERSION}_Server_win64.exe" + !define PRODUCT_DISPLAY_NAME "HologramAgent 服务端" + !define OUTPUT_FILE "HologramAgent_v${PRODUCT_VERSION}_Server_win64.exe" !define HAS_CORE 1 !define HAS_WAITER 0 !define HAS_GUI 0 !define HAS_CREDENTIALS 1 !else if "${VARIANT}" == "client" - !define PRODUCT_DISPLAY_NAME "HomeAgent 客户端" - !define OUTPUT_FILE "HomeAgent_v${PRODUCT_VERSION}_Client_win64.exe" + !define PRODUCT_DISPLAY_NAME "HologramAgent 客户端" + !define OUTPUT_FILE "HologramAgent_v${PRODUCT_VERSION}_Client_win64.exe" !define HAS_CORE 0 !define HAS_WAITER 1 !define HAS_GUI 1 @@ -47,7 +47,7 @@ OutFile "..\..\build\${OUTPUT_FILE}" InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}" InstallDirRegKey HKLM "Software\${PRODUCT_NAME}" "" RequestExecutionLevel admin -BrandingText "HomeAgent Installer" +BrandingText "HologramAgent Installer" SetCompressor /SOLID lzma ShowInstDetails show ShowUninstDetails show @@ -68,7 +68,7 @@ Function GenKey Pop $0 Pop $1 ${If} $1 == "" - StrCpy $1 "homeagent" + StrCpy $1 "hologram" ${Else} StrCpy $1 $1 32 ${EndIf} @@ -111,13 +111,13 @@ FunctionEnd !if "${HAS_CORE}" == "1" Function pageStartupOptions - !insertmacro MUI_HEADER_TEXT "启动选项" "设置 HomeAgent 后端的启动方式" + !insertmacro MUI_HEADER_TEXT "启动选项" "设置 HologramAgent 后端的启动方式" nsDialogs::Create 1018 Pop $0 ${If} $0 == error Abort ${EndIf} - ${NSD_CreateLabel} 0 5u 100% 20u "HomeAgent 后端 (homed) 是持续运行的服务进程。$\r$\n请选择启动方式:" + ${NSD_CreateLabel} 0 5u 100% 20u "HologramAgent 后端 (homed) 是持续运行的服务进程。$\r$\n请选择启动方式:" Pop $0 ${NSD_CreateCheckBox} 10u 35u 100% 12u "开机自动启动后端 (添加到注册表启动项)" Pop $hwndAutoStart @@ -190,7 +190,7 @@ Function pageCredentialsLeave ${NSD_GetText} $hwndUsername $webuiUsername ${NSD_GetText} $hwndPassword $webuiPassword ${If} $webuiPassword == "" - StrCpy $webuiPassword "homeagent" + StrCpy $webuiPassword "hologram" ${EndIf} FunctionEnd @@ -244,15 +244,15 @@ Section "Install" SEC_INSTALL !endif !if "${HAS_GUI}" == "1" - SetOutPath "$INSTDIR\homeagent-gui-win32-x64" - File /r "..\..\build\homeagent-gui-win32-x64\*.*" + SetOutPath "$INSTDIR\hologram-gui-win32-x64" + File /r "..\..\build\hologram-gui-win32-x64\*.*" SetOutPath "$INSTDIR" !endif !if "${HAS_CORE}" == "1" ; 在 WSL2 里安装 homed。凭据(页面上收的那三个)透传进去,避免 ; 「界面显示一份、config.db 里另一份」导致登录不上。 - DetailPrint "检测 WSL 并在其中安装 HomeAgent..." + DetailPrint "检测 WSL 并在其中安装 HologramAgent..." nsExec::ExecToStack 'powershell -NoProfile -ExecutionPolicy Bypass -File "$INSTDIR\install-via-wsl.ps1" -PayloadDir "$PLUGINSDIR\linux-payload" -ApiKey "$apiKey" -WebUIUser "$webuiUsername" -WebUIPass "$webuiPassword"' Pop $0 Pop $1 @@ -267,19 +267,19 @@ Section "Install" SEC_INSTALL MessageBox MB_ICONEXCLAMATION|MB_OK "WSL 内安装失败(退出码 $0)。$\r$\n$\r$\n可进入 WSL 手动排查:wsl -d Ubuntu$\r$\n安装脚本输出见上方日志。" ${EndIf} ${Else} - DetailPrint "HomeAgent 已在 WSL2 内安装完成" + DetailPrint "HologramAgent 已在 WSL2 内安装完成" ${EndIf} !endif !if "${HAS_GUI}" == "1" DetailPrint "配置 GUI 连接..." - CreateDirectory "$APPDATA\homeagent-gui" - FileOpen $0 "$APPDATA\homeagent-gui\connections.json" w + CreateDirectory "$APPDATA\hologram-gui" + FileOpen $0 "$APPDATA\hologram-gui\connections.json" w FileWrite $0 '{$\r$\n "connections": [$\r$\n {$\r$\n "id": "local",$\r$\n "name": "本地",$\r$\n "url": "http://localhost:8080",$\r$\n "apiKey": "$apiKey"$\r$\n }$\r$\n ],$\r$\n "currentId": "local"$\r$\n}' FileClose $0 ; 同时写入 GUI 包目录作为备用(适配 UAC 提升后 $APPDATA 异常的情况) - CreateDirectory "$INSTDIR\homeagent-gui-win32-x64\resources\app" - FileOpen $0 "$INSTDIR\homeagent-gui-win32-x64\resources\app\connections.json" w + CreateDirectory "$INSTDIR\hologram-gui-win32-x64\resources\app" + FileOpen $0 "$INSTDIR\hologram-gui-win32-x64\resources\app\connections.json" w FileWrite $0 '{$\r$\n "connections": [$\r$\n {$\r$\n "id": "local",$\r$\n "name": "本地",$\r$\n "url": "http://localhost:8080",$\r$\n "apiKey": "$apiKey"$\r$\n }$\r$\n ],$\r$\n "currentId": "local"$\r$\n}' FileClose $0 !endif @@ -294,23 +294,23 @@ Section "Install" SEC_INSTALL DetailPrint "创建快捷方式..." CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" !if "${HAS_CORE}" == "1" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\HomeAgent Server.lnk" "$INSTDIR\homed.exe" '-data "$INSTDIR\data"' "$INSTDIR\homed.exe" 0 + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\HologramAgent Server.lnk" "$INSTDIR\homed.exe" '-data "$INSTDIR\data"' "$INSTDIR\homed.exe" 0 !endif !if "${HAS_WAITER}" == "1" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\HomeAgent CLI.lnk" "$INSTDIR\waiter.exe" "" "$INSTDIR\waiter.exe" 0 + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\HologramAgent CLI.lnk" "$INSTDIR\waiter.exe" "" "$INSTDIR\waiter.exe" 0 !endif !if "${HAS_GUI}" == "1" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\HomeAgent GUI.lnk" "$INSTDIR\homeagent-gui-win32-x64\homeagent-gui.exe" "" "$INSTDIR\homeagent-gui-win32-x64\homeagent-gui.exe" 0 + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\HologramAgent GUI.lnk" "$INSTDIR\hologram-gui-win32-x64\hologram-gui.exe" "" "$INSTDIR\hologram-gui-win32-x64\hologram-gui.exe" 0 !endif DetailPrint "设置环境变量..." - WriteRegStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "HOMEAGENT_DATA" "$INSTDIR\data" - WriteRegStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "HOMEAGENT_SOCKET" "$INSTDIR\data\cli.sock" + WriteRegStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "HOLOGRAM_DATA" "$INSTDIR\data" + WriteRegStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "HOLOGRAM_SOCKET" "$INSTDIR\data\cli.sock" !if "${HAS_CORE}" == "1" ${If} $autoStart == "1" DetailPrint "设置开机自启动..." - WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "HomeAgent" '"$INSTDIR\homed.exe" -data "$INSTDIR\data"' + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "HologramAgent" '"$INSTDIR\homed.exe" -data "$INSTDIR\data"' ${EndIf} !endif @@ -328,7 +328,7 @@ Section "Install" SEC_INSTALL !if "${HAS_CORE}" == "1" ${If} $startNow == "1" - DetailPrint "启动 HomeAgent 后端..." + DetailPrint "启动 HologramAgent 后端..." Exec '"$INSTDIR\homed.exe" -data "$INSTDIR\data"' ${EndIf} !endif @@ -336,7 +336,7 @@ SectionEnd Section "Uninstall" !if "${HAS_CORE}" == "1" - DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "HomeAgent" + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "HologramAgent" !endif Delete "$INSTDIR\Uninstall.exe" Delete "$INSTDIR\initconfig.exe" @@ -344,14 +344,14 @@ Section "Uninstall" Delete "$INSTDIR\waiter.exe" Delete "$INSTDIR\waiter.yaml" RMDir /r "$INSTDIR\data" - RMDir /r "$INSTDIR\homeagent-gui-win32-x64" + RMDir /r "$INSTDIR\hologram-gui-win32-x64" RMDir "$INSTDIR" - Delete "$SMPROGRAMS\${PRODUCT_NAME}\HomeAgent Server.lnk" - Delete "$SMPROGRAMS\${PRODUCT_NAME}\HomeAgent CLI.lnk" - Delete "$SMPROGRAMS\${PRODUCT_NAME}\HomeAgent GUI.lnk" + Delete "$SMPROGRAMS\${PRODUCT_NAME}\HologramAgent Server.lnk" + Delete "$SMPROGRAMS\${PRODUCT_NAME}\HologramAgent CLI.lnk" + Delete "$SMPROGRAMS\${PRODUCT_NAME}\HologramAgent GUI.lnk" RMDir "$SMPROGRAMS\${PRODUCT_NAME}" - DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "HOMEAGENT_DATA" - DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "HOMEAGENT_SOCKET" + DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "HOLOGRAM_DATA" + DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "HOLOGRAM_SOCKET" DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" DeleteRegKey HKLM "Software\${PRODUCT_NAME}" SectionEnd diff --git a/deploy/packaging/package-windows.sh b/deploy/packaging/package-windows.sh index 5227a13f..1d54eb13 100644 --- a/deploy/packaging/package-windows.sh +++ b/deploy/packaging/package-windows.sh @@ -16,6 +16,23 @@ set -euo pipefail PROJECT_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +# ★ 版本号的**解析规则**必须与 package-linux.sh / build.sh 同源(2026-10-17 统一)。 +# 原先这里直接 `git describe --tags`,在无 tag 分支上会拿到分支名 +# (backup/pre-identity-rewrite-...-g-dirty),于是: +# · 这个脚本拿它当 VERSION 去拼 DEB_GLOB ⇒ 找不到 Linux 包,报"[FAIL] 找不到" +# 看上去像"Linux 包没打出来",实际是版本号被解析成分支名; +# · 就算找到了,安装器的 DisplayVersion 也会变成那串东西。 +# 统一为:git describe 只在形如 vX.Y.Z 时采用,否则回退 meta.Version。 +_meta_version() { + local mv + mv="$(sed -n 's/^[[:space:]]*Version[[:space:]]*=[[:space:]]*"\([^"]*\)".*/\1/p' \ + "$PROJECT_ROOT/internal/meta/meta.go" 2>/dev/null | head -1)" + case "$mv" in + [0-9]*.[0-9]*.[0-9]*) printf '%s' "$mv"; return 0 ;; + esac + return 1 +} + # 三个目录都可覆盖:发布件常在 tag 的干净 worktree 里构建,而这个脚本本身 # 可能只存在于 main(例如刚补的驱动脚本还没进 tag)——那种情况下用主仓的脚本 + # DIST_LINUX/BUILD_DIR/DIST_RELEASE 指向 worktree,避免"脚本不存在"或产物错位。 @@ -34,13 +51,30 @@ fi VARIANT="${1:-server}" ARCH="${2:-amd64}" -VERSION="${VERSION:-$(git -C "$PROJECT_ROOT" describe --tags 2>/dev/null || echo 0.0.0)}" +if [ -z "${VERSION:-}" ]; then + _gd="$(git -C "$PROJECT_ROOT" describe --tags --dirty 2>/dev/null || true)" + case "$_gd" in + v[0-9]*.[0-9]*.[0-9]*) VERSION="${_gd#v}" ;; + *) + if VERSION="$(_meta_version)"; then + [ -n "$_gd" ] && echo "[PKG] warn: git describe 给出非版本串($_gd),改用 meta.Version=$VERSION" >&2 + else + echo "[FAIL] 拿不到合法版本号(git describe=$_gd)。请显式传 VERSION=x.y.z。" >&2 + exit 1 + fi + ;; + esac +fi VERSION="${VERSION#v}" +case "$VERSION" in + [0-9]*) ;; + *) echo "[FAIL] VERSION='$VERSION' 必须以数字开头(deb/rpm 与 DisplayVersion 都要求)。" >&2; exit 1 ;; +esac case "$VARIANT" in - server) DEB_GLOB="homeagent-server_${VERSION}_${ARCH}.deb"; SUFFIX="Server"; WANT_GUI=0; WANT_WAITER=0 ;; - full) DEB_GLOB="homeagent-full_${VERSION}_${ARCH}.deb"; SUFFIX="Full"; WANT_GUI=1; WANT_WAITER=1 ;; - client) DEB_GLOB="homeagent-client_${VERSION}_${ARCH}.deb"; SUFFIX="Client"; WANT_GUI=1; WANT_WAITER=1 ;; + server) DEB_GLOB="hologramagent-server_${VERSION}_${ARCH}.deb"; SUFFIX="Server"; WANT_GUI=0; WANT_WAITER=0 ;; + full) DEB_GLOB="hologramagent-full_${VERSION}_${ARCH}.deb"; SUFFIX="Full"; WANT_GUI=1; WANT_WAITER=1 ;; + client) DEB_GLOB="hologramagent-client_${VERSION}_${ARCH}.deb"; SUFFIX="Client"; WANT_GUI=1; WANT_WAITER=1 ;; *) echo "用法: $0 [arch]" >&2; exit 2 ;; esac @@ -54,14 +88,37 @@ fi # client/full 还要带 Windows GUI(HAS_GUI=1)。本机缺 electron-builder,若 build/ 下 # 没有可用的 win32-x64 payload 就**明确失败**,不产出"装完没有界面"的半残包。 +# +# ★ payload 目录名有两个可能来源,必须都认: +# 1. electron-builder(deploy/packaging/build.sh 的 build_gui,productName=HomeAgent) +# ⇒ build/homeagent-gui-win32-x64 +# 2. electron-packager(Makefile:331,GUI_BINARY=homeagent-gui) +# ⇒ build/homeagent-gui-win32-x64 之外的名字 +# 而 installer.nsi(本仓已改名)期望的是 hologram-gui-win32-x64。 +# 生产 GUI 产物的命名归 Makefile / cmd/gui(本批范围外),所以这里**不假设** +# 上游已改名:找到哪个就用哪个,并统一 stage 成 .nsi 期望的名字。 +# 漏了这一步,改名后 Windows 包会以"[FAIL] 需要 GUI payload"失败——或者更糟, +# 若哪天有人把检查放宽成"有 .exe 就行",打出的安装器会 File 一个不存在的目录。 if [ "$WANT_GUI" = 1 ]; then - if [ -z "$(ls -1 "$BUILD_DIR"/homeagent-gui-win32-x64/*.exe 2>/dev/null | head -1 || true)" ]; then - echo "[FAIL] 变体 $VARIANT 需要 Windows GUI payload(build/homeagent-gui-win32-x64/*.exe)" >&2 + GUI_PAYLOAD="" + for cand in "$BUILD_DIR"/hologram-gui-win32-x64 "$BUILD_DIR"/homeagent-gui-win32-x64 "$BUILD_DIR"/homeagent-gui-win32-*; do + if [ -n "$(ls -1 "$cand"/*.exe 2>/dev/null | head -1 || true)" ]; then + GUI_PAYLOAD="$cand" + break + fi + done + if [ -z "$GUI_PAYLOAD" ]; then + echo "[FAIL] 变体 $VARIANT 需要 Windows GUI payload(build/{hologram,homeagent}-gui-win32-x64/*.exe)" >&2 echo " 本机无 electron-builder:npm i -g electron-builder &&" >&2 echo " bash deploy/packaging/build.sh windows/amd64 gui" >&2 echo " (只装内核+CLI 的 WSL 场景请用 server 变体)" >&2 exit 1 fi + if [ "$(basename "$GUI_PAYLOAD")" != "hologram-gui-win32-x64" ]; then + echo "[STAGE] GUI payload $(basename "$GUI_PAYLOAD") → hologram-gui-win32-x64(.nsi 期望的名字)" + rm -rf "$BUILD_DIR/hologram-gui-win32-x64" + cp -a "$GUI_PAYLOAD" "$BUILD_DIR/hologram-gui-win32-x64" + fi fi if [ "$WANT_WAITER" = 1 ]; then @@ -83,7 +140,7 @@ fi echo "[BUILD] makensis -DVARIANT=$VARIANT -DPRODUCT_VERSION=$VERSION(nsi: $NSI)" makensis -V2 -DVARIANT="$VARIANT" -DPRODUCT_VERSION="$VERSION" "$NSI" -OUT="$BUILD_DIR/HomeAgent_v${VERSION}_${SUFFIX}_win64.exe" +OUT="$BUILD_DIR/HologramAgent_v${VERSION}_${SUFFIX}_win64.exe" if [ ! -f "$OUT" ]; then echo "[FAIL] 未找到产物 $OUT" >&2 exit 1 diff --git a/deploy/packaging/windows/install-via-wsl.ps1 b/deploy/packaging/windows/install-via-wsl.ps1 index 9d3db1af..fa5c7a62 100644 --- a/deploy/packaging/windows/install-via-wsl.ps1 +++ b/deploy/packaging/windows/install-via-wsl.ps1 @@ -1,6 +1,6 @@ <# .SYNOPSIS - 在 WSL2 中安装 HomeAgent(homed + 插件 + WebUI)。 + 在 WSL2 中安装 HologramAgent(homed + 插件 + WebUI)。 .DESCRIPTION Windows 不再提供 homed 的原生安装。原因见 cmd/homed/platform_windows.go: @@ -23,7 +23,7 @@ 目标发行版名。省略则用默认发行版;没有发行版时引导安装 Ubuntu。 .PARAMETER DataDir - WSL 内的数据目录。默认 /var/lib/homeagent(与 Linux 原生安装一致)。 + WSL 内的数据目录。默认 /var/lib/hologram(与 Linux 原生安装一致)。 不建议放 /mnt/c/...:跨文件系统 IO 慢,且 inotify 语义受限。 .NOTES @@ -35,7 +35,7 @@ param( [Parameter(Mandatory = $true)][string]$PayloadDir, [string]$Distro = "", - [string]$DataDir = "/var/lib/homeagent", + [string]$DataDir = "/var/lib/hologram", [string]$ApiKey = "", [string]$WebUIUser = "", [string]$WebUIPass = "", @@ -160,19 +160,19 @@ $winPath = (Resolve-Path $pkg).Path $mntPath = "/mnt/" + $winPath.Substring(0, 1).ToLower() + ($winPath.Substring(2) -replace '\\', '/') Write-Host " 源:$mntPath" -& wsl.exe -d $script:DistroName -u root -- bash -lc "mkdir -p /tmp/homeagent-install" +& wsl.exe -d $script:DistroName -u root -- bash -lc "mkdir -p /tmp/hologramagent-install" if ($LASTEXITCODE -ne 0) { Fail "无法在 WSL 内创建临时目录" "确认发行版可正常启动:wsl -d $($script:DistroName)" } -& wsl.exe -d $script:DistroName -u root -- bash -lc "cp '$mntPath' /tmp/homeagent-install/" +& wsl.exe -d $script:DistroName -u root -- bash -lc "cp '$mntPath' /tmp/hologramagent-install/" if ($LASTEXITCODE -ne 0) { Fail "复制安装包失败" } -Write-Ok "已送到 /tmp/homeagent-install/" +Write-Ok "已送到 /tmp/hologramagent-install/" # ── 5. 在 WSL 内安装 ─────────────────────────────────────────────────────── Write-Stage "在 WSL 内安装 homed" -# 凭据经环境变量传给 setup.sh(它已支持 HOMEAGENT_API_KEY / WEBUI_USER / WEBUI_PASS)。 +# 凭据经环境变量传给 setup.sh(它已支持 HOLOGRAM_API_KEY / WEBUI_USER / WEBUI_PASS)。 # 不传的话就会「界面显示一份、config.db 里另一份」,用户直接登录不上。 $credEnv = "" -if ($ApiKey) { $credEnv += "export HOMEAGENT_API_KEY='$ApiKey'; " } +if ($ApiKey) { $credEnv += "export HOLOGRAM_API_KEY='$ApiKey'; " } if ($WebUIUser) { $credEnv += "export WEBUI_USER='$WebUIUser'; " } if ($WebUIPass) { $credEnv += "export WEBUI_PASS='$WebUIPass'; " } @@ -180,34 +180,34 @@ if ($WebUIPass) { $credEnv += "export WEBUI_PASS='$WebUIPass'; " } # tar 则解包到你同一套布局再执行同一份 setup.sh。刻意不在这里重写安装步骤—— # 「WSL 里就是普通 linux/amd64」必须保持成立,否则等于又开了第三个平台。 if ($pkgKind -eq "deb") { - $inWslPkg = "/tmp/homeagent-install/" + (Split-Path $pkg -Leaf) + $inWslPkg = "/tmp/hologramagent-install/" + (Split-Path $pkg -Leaf) & wsl.exe -d $script:DistroName -u root -- bash -lc @" set -e $credEnv -export HOMEAGENT_DATA='$DataDir' +export HOLOGRAM_DATA='$DataDir' apt-get update -qq DEBIAN_FRONTEND=noninteractive apt-get install -y -qq '$inWslPkg' "@ } else { - $inWslPkg = "/tmp/homeagent-install/" + (Split-Path $pkg -Leaf) + $inWslPkg = "/tmp/hologramagent-install/" + (Split-Path $pkg -Leaf) & wsl.exe -d $script:DistroName -u root -- bash -lc @" set -e $credEnv -mkdir -p /opt/homeagent /tmp/homeagent-extract -tar -xzf '$inWslPkg' -C /tmp/homeagent-extract -cd /tmp/homeagent-extract -# 与 deb 完全相同的布局:/usr/bin/homed + /usr/lib/homeagent/setup.sh。 +mkdir -p /opt/hologramagent /tmp/hologramagent-extract +tar -xzf '$inWslPkg' -C /tmp/hologramagent-extract +cd /tmp/hologramagent-extract +# 与 deb 完全相同的布局:/usr/bin/homed + /usr/lib/hologram/setup.sh。 # 两套安装若落到不同路径,之后的升级/排障就会出现「按文档找不到文件」。 install -m 0755 homed /usr/bin/homed install -m 0755 waiter /usr/bin/waiter [ -f initconfig ] && install -m 0755 initconfig /usr/bin/initconfig -if [ -f homeagent.service ]; then - install -m 0644 homeagent.service /etc/systemd/system/homeagent.service +if [ -f hologramagent.service ]; then + install -m 0644 hologramagent.service /etc/systemd/system/hologramagent.service fi -mkdir -p /usr/lib/homeagent -if [ -f setup.sh ]; then install -m 0755 setup.sh /usr/lib/homeagent/setup.sh; fi -export HOMEAGENT_DATA='$DataDir' -if [ -x /usr/lib/homeagent/setup.sh ]; then bash /usr/lib/homeagent/setup.sh; fi +mkdir -p /usr/lib/hologram +if [ -f setup.sh ]; then install -m 0755 setup.sh /usr/lib/hologram/setup.sh; fi +export HOLOGRAM_DATA='$DataDir' +if [ -x /usr/lib/hologram/setup.sh ]; then bash /usr/lib/hologram/setup.sh; fi "@ } if ($LASTEXITCODE -ne 0) { @@ -219,14 +219,14 @@ Write-Ok "安装完成" Write-Stage "启动 homed 与自启配置" & wsl.exe -d $script:DistroName -u root -- bash -lc @" -if command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files 2>/dev/null | grep -q homeagent; then - systemctl enable homeagent 2>/dev/null || true - systemctl restart homeagent - echo ' ✓ systemd 服务 homeagent 已启动并设为自启' +if command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files 2>/dev/null | grep -q hologramagent; then + systemctl enable hologramagent 2>/dev/null || true + systemctl restart hologramagent + echo ' ✓ systemd 服务 hologramagent 已启动并设为自启' else # 没有 systemd(WSL2 默认可能没开):用 nohup 起,并把自启交给 Windows 侧的计划任务。 pkill -f '/usr/bin/homed' 2>/dev/null || true - nohup /usr/bin/homed -data '$DataDir' > /var/log/homeagent-boot.log 2>&1 & + nohup /usr/bin/homed -data '$DataDir' > /var/log/hologram-boot.log 2>&1 & echo ' ✓ 已用 nohup 启动(未检测到 systemd)' fi "@ @@ -235,7 +235,7 @@ $creds = & wsl.exe -d $script:DistroName -u root -- bash -lc "cat '$DataDir/cred Write-Host "" Write-Host "============================================================" -ForegroundColor Green -Write-Host " HomeAgent 已在 WSL2($($script:DistroName))内安装完成" -ForegroundColor Green +Write-Host " HologramAgent 已在 WSL2($($script:DistroName))内安装完成" -ForegroundColor Green Write-Host "============================================================" -ForegroundColor Green Write-Host "" Write-Host " WebUI:http://localhost:8080" -ForegroundColor White @@ -250,10 +250,10 @@ if ($creds) { Write-Host "" Write-Host " 常用操作(在 PowerShell 中):" Write-Host " 进入 WSL : wsl -d $($script:DistroName)" -Write-Host " 查看日志 : wsl -d $($script:DistroName) -u root -- journalctl -u homeagent -f" -Write-Host " 重启服务 : wsl -d $($script:DistroName) -u root -- systemctl restart homeagent" +Write-Host " 查看日志 : wsl -d $($script:DistroName) -u root -- journalctl -u hologramagent -f" +Write-Host " 重启服务 : wsl -d $($script:DistroName) -u root -- systemctl restart hologramagent" Write-Host "" Write-Host " 注意:WSL 实例不会随 Windows 启动而自动拉起。若需要开机自启," Write-Host " 可创建一个登录时触发的计划任务执行:" -Write-Host " wsl -d $($script:DistroName) -u root -- systemctl start homeagent" +Write-Host " wsl -d $($script:DistroName) -u root -- systemctl start hologramagent" exit 0 diff --git a/deploy/scripts/deploy.sh b/deploy/scripts/deploy.sh index 661b71ca..63ea5cea 100644 --- a/deploy/scripts/deploy.sh +++ b/deploy/scripts/deploy.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash set -euo pipefail -# HomeAgent 部署脚本 +# HologramAgent 部署脚本 # 用法: cd && sudo bash deploy/scripts/deploy.sh PROJECT_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" BIN_DIR="/usr/local/bin" DATA_DIR="/home/newqqagent" -SERVICE_FILE="/etc/systemd/system/homeagent.service" +SERVICE_FILE="/etc/systemd/system/hologramagent.service" echo "=== 构建 homed / waiter ===" cd "$PROJECT_ROOT" @@ -30,16 +30,16 @@ if [ -d "$PROJECT_ROOT/plugins/qq" ]; then fi echo "=== 安装 systemd 服务 ===" -cp "$(dirname "$0")/homeagent.service" "$SERVICE_FILE" +cp "$(dirname "$0")/hologramagent.service" "$SERVICE_FILE" systemctl daemon-reload echo "" echo "=== 部署完成 ===" echo "" -echo "启动: systemctl start homeagent" -echo "状态: systemctl status homeagent" -echo "日志: journalctl -u homeagent -f" -echo "停止: systemctl stop homeagent" +echo "启动: systemctl start hologramagent" +echo "状态: systemctl status hologramagent" +echo "日志: journalctl -u hologramagent -f" +echo "停止: systemctl stop hologramagent" echo "WebUI: http://localhost:8080" echo "CLI: /home/newqqagent/cli.sock" echo ""