Home Manager 集成
本文介绍 homeModules.default 在独立 Home Manager 和由 NixOS 管理的
Home Manager 中的用法,重点说明如何让 pkgs.dsh 可用,以及 Nix 如何管理
profile。per-user web 服务见 高级用法。
添加 Flake Input
Section titled “添加 Flake Input”{ inputs.deepseek-harness.url = "github:moraxyc/deepseek-harness.nix";}如果这个仓库在你的 flake 里用了其他 input 名,例如 dsh,请把示例中的
inputs.deepseek-harness 替换成对应名称。
让 pkgs.dsh 可用
Section titled “让 pkgs.dsh 可用”homeModules.default 默认从 pkgs.dsh 解析 programs.dsh.package,示例中
也会使用 pkgs.dsh.bundles.*。可以按以下任一方式接入:
- 独立 Home Manager:向
homeManagerConfiguration传入已经包含inputs.deepseek-harness.overlays.default的pkgs; - NixOS 管理的 Home Manager:启用
home-manager.useGlobalPkgs = true,并把 overlay 加入 NixOS 级nixpkgs.overlays; - 任意方式:显式设置
programs.dsh.package。
独立 Home Manager
Section titled “独立 Home Manager”flake 模块示例:
{ inputs, ... }:let pkgs = import inputs.nixpkgs { system = "x86_64-linux"; overlays = [ inputs.deepseek-harness.overlays.default ]; };ininputs.home-manager.lib.homeManagerConfiguration { inherit pkgs; modules = [ ./home.nix ];}home.nix:
{ inputs, pkgs, ... }:{ imports = [ inputs.deepseek-harness.homeModules.default ];
programs.dsh = { enable = true; profiles.tui = { bundles = [ pkgs.dsh.bundles.tui ]; mode = "managed"; }; defaultProfile = "nix-tui"; };}该模块会把组合后的包加入 home.packages,并在 Home Manager 激活时生成和
同步受管理的 profile。
Profile 可以引用 programs.dsh.agentPresets 中的定义:设置
agentPreset = "name",再单独列出 provider bundle。Home Manager 会在激活时复制
指定的 preset;工具授权示例见高级用法。
设置 programs.dsh.home 可以改用其他 DSH_HOME:
{ config, ... }:{ programs.dsh.home = "${config.home.homeDirectory}/.local/share/dsh";}未设置时,dsh 使用 ~/.dsh。显式设置后,Home Manager 会把它导出到用户
会话,并在激活时用它同步 profile;除非另设 services.dsh.dataDir,用户服务
也会继承该路径。
Home 级 Cordis patch 可以用结构化数据声明:
programs.dsh.patch = [ { id = "agent-default-model"; config = { provider = "deepseek-official"; model = "deepseek-v4-flash"; }; }];Home Manager 会在激活时把该列表同步到 $DSH_HOME/cordis.patch.yml。组合后的
CLI 和用户服务也会在启动前还原它。该层在每个 profile patch 之后应用;设为
null 时不管理此文件。
NixOS 管理的 Home Manager
Section titled “NixOS 管理的 Home Manager”当 Home Manager 由 NixOS 管理时:
- 启用
home-manager.useGlobalPkgs = true; - 在 NixOS 级
nixpkgs.overlays中加入inputs.deepseek-harness.overlays.default; - 在目标用户下导入
homeModules.default。
{ inputs, pkgs, ... }:{ home-manager = { useGlobalPkgs = true; users.moraxyc = { config, ... }: { imports = [ inputs.deepseek-harness.homeModules.default ];
programs.dsh = { enable = true; profiles.tui.bundles = [ pkgs.dsh.bundles.tui ]; defaultProfile = config.programs.dsh.profiles.tui.materializedName; }; }; };}home-manager.useGlobalPkgs = true 只是让 Home Manager 使用 NixOS 全局
pkgs,不会自动加入 dsh overlay。如果全局 pkgs 中没有 dsh,求值会报
attribute 'dsh' missing。
如果已经导入 nixosModules.default,该模块会自动设置 NixOS overlay。
显式设置 Package
Section titled “显式设置 Package”如果不能注入 overlay,可以显式把 programs.dsh.package 设置为另一个 pkgs
中的 dsh 包。组合 profile 时仍然需要 pkgs.dsh.bundles.* 或显式 bundle
列表。
programs.dsh.package = inputs.deepseek-harness.packages.${pkgs.system}.dsh;Profile 模式
Section titled “Profile 模式”managed:每次激活和每次运行dsh都会把 profile 重新同步为配置内容, 因此对受管理的package.json和cordis.patch.yml的本地修改会被还原。mutable:仅在 profile 目录不存在时由 Nix 初始化一次;之后用户通过dsh plugin管理,Nix 不再改动。
两种模式都不会接管已有但没有 Nix 标记的同名目录。
Per-User Web 服务
Section titled “Per-User Web 服务”homeModules.default 还提供 services.dsh,以 systemd user 单元运行。
设置后使用 programs.dsh.home,否则默认使用 ~/.dsh,因此会与 CLI 生成的
profile 共用:
services.dsh = { enable = true; port = 3080;};单元名为 dsh-web:
systemctl --user start dsh-websystemctl --user status dsh-webjournalctl --user -u dsh-web -f选项与 NixOS 服务基本一致,仅不含 user、group、openFirewall。细节见
高级用法。其中 dataDir 默认是 ~/.dsh,
workspace 默认是 ~/.dsh/workspace,autoStart 默认是 true。
attribute 'dsh' missing表示homeModules.default看到的pkgs中 没有 dsh scope。需要把 overlay 注入该 pkgs,或显式设置programs.dsh.package。- 在 NixOS 管理的 Home Manager 中,在 Home Manager 用户模块里写
nixpkgs.overlays不能可靠替代 NixOS 级 overlay;应使用全局nixpkgs.overlays。 - 如果
dsh启动后没有使用预期 profile,检查programs.dsh.defaultProfile是否写的是生成后的名称(nix-tui);原始 profile key 是tui,不能直接使用。