add claudePluginsAutoUpdate NixOS option, default false

This commit is contained in:
damocles 2026-05-17 02:22:04 +02:00
parent 6652ae90ab
commit ca86bcf4bd
2 changed files with 31 additions and 1 deletions

View file

@ -19,6 +19,7 @@ use crate::client;
const PLUGINS_PATH: &str = "/etc/hyperhive/claude-plugins.json"; const PLUGINS_PATH: &str = "/etc/hyperhive/claude-plugins.json";
const MARKETPLACES_PATH: &str = "/etc/hyperhive/claude-marketplaces.json"; const MARKETPLACES_PATH: &str = "/etc/hyperhive/claude-marketplaces.json";
const AUTO_UPDATE_PATH: &str = "/etc/hyperhive/claude-plugins-auto-update.json";
/// Add every marketplace from `/etc/hyperhive/claude-marketplaces.json` /// Add every marketplace from `/etc/hyperhive/claude-marketplaces.json`
/// via `claude plugin marketplace add <source>`. Idempotent: re-add of /// via `claude plugin marketplace add <source>`. Idempotent: re-add of
@ -66,6 +67,15 @@ async fn add_marketplaces() {
} }
} }
/// Read the `hyperhive.claudePluginsAutoUpdate` flag written by the NixOS
/// module. Defaults to `false` when the file is absent or unparseable.
async fn auto_update_enabled() -> bool {
match tokio::fs::read_to_string(AUTO_UPDATE_PATH).await {
Ok(s) => serde_json::from_str::<bool>(s.trim()).unwrap_or(false),
Err(_) => false,
}
}
/// Update all configured plugin marketplaces. Non-fatal — logs a warning /// Update all configured plugin marketplaces. Non-fatal — logs a warning
/// on failure but does not abort the install sequence. /// on failure but does not abort the install sequence.
async fn update_marketplaces() { async fn update_marketplaces() {
@ -112,7 +122,11 @@ pub async fn install_configured(socket: &Path, notify_recipient: Option<&str>) {
return; return;
} }
add_marketplaces().await; add_marketplaces().await;
if auto_update_enabled().await {
update_marketplaces().await; update_marketplaces().await;
} else {
tracing::debug!("claudePluginsAutoUpdate=false, skipping marketplace update");
}
for spec in specs { for spec in specs {
match Command::new("claude") match Command::new("claude")
.args(["plugin", "install", &spec]) .args(["plugin", "install", &spec])

View file

@ -149,6 +149,19 @@
''; '';
}; };
options.hyperhive.claudePluginsAutoUpdate = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
When true, the harness runs `claude plugin marketplace update`
before installing plugins at boot, pulling the latest index from
all configured marketplaces. Disabled by default most agents
want pinned plugin versions and the network round-trip adds to
boot time. Enable for agents that should always install the latest
available version of their plugins.
'';
};
config = { config = {
environment.etc."hyperhive/extra-mcp.json".text = builtins.toJSON config.hyperhive.extraMcpServers; environment.etc."hyperhive/extra-mcp.json".text = builtins.toJSON config.hyperhive.extraMcpServers;
@ -161,6 +174,9 @@
environment.etc."hyperhive/claude-marketplaces.json".text = environment.etc."hyperhive/claude-marketplaces.json".text =
builtins.toJSON config.hyperhive.claudeMarketplaces; builtins.toJSON config.hyperhive.claudeMarketplaces;
environment.etc."hyperhive/claude-plugins-auto-update.json".text =
builtins.toJSON config.hyperhive.claudePluginsAutoUpdate;
boot.isNspawnContainer = true; boot.isNspawnContainer = true;
# `claude-code` is unfree. Each per-agent container's nixosConfiguration # `claude-code` is unfree. Each per-agent container's nixosConfiguration