rename choom flag --continue to --resume to match the claude flag it maps to (mara review)

This commit is contained in:
damocles 2026-07-02 19:48:54 +02:00 committed by mara
commit 2f43077e31
3 changed files with 36 additions and 35 deletions

View file

@ -379,7 +379,7 @@ Generate the federation peer-config block for THIS hive — the nix a peer opera
Open an interactive Claude session inside an agent container. Open an interactive Claude session inside an agent container.
Runs claude as the agent user from its state dir with the harness's settings / MCP / system prompt. Bare `choom <name>` is a fresh session; `--continue <session-id>` rejoins a prior one. Never collides with the harness's live session. Requires root + a running container. See `docs/tools/hivectl.md` (Choom) for details. Runs claude as the agent user from its state dir with the harness's settings / MCP / system prompt. Bare `choom <name>` is a fresh session; `--resume <session-id>` rejoins a prior one. Never collides with the harness's live session. Requires root + a running container. See `docs/tools/hivectl.md` (Choom) for details.
**Usage:** `hivectl choom [OPTIONS] <NAME>` **Usage:** `hivectl choom [OPTIONS] <NAME>`
@ -389,7 +389,7 @@ Runs claude as the agent user from its state dir with the harness's settings / M
###### **Options:** ###### **Options:**
* `--continue <SESSION>` — Resume a prior claude session by its session id, passed through as `claude --resume <value>` (claude's own `--continue` takes no value — it resumes the cwd's latest session, which is the harness's, so choom never uses it). Omit for a fresh blank session. A value is required when the flag is given * `--resume <SESSION>` — Resume a prior claude session by its session id, passed through as `claude --resume <value>` (claude's `--continue` takes no value — it resumes the cwd's latest session, which is the harness's, so choom never uses it; this flag matches the claude flag it maps to). Omit for a fresh blank session. A value is required when the flag is given

View file

@ -127,20 +127,21 @@ running claude from the agent's state dir. Requires root (same as all
`machinectl shell` operations). `machinectl shell` operations).
```bash ```bash
hivectl choom iris # fresh blank Claude session in iris's container hivectl choom iris # fresh blank Claude session in iris's container
hivectl choom iris --continue <session-id> # rejoin a prior session by id hivectl choom iris --resume <session-id> # rejoin a prior session by id
``` ```
Bare `choom` starts a fresh blank session. `--continue <value>` maps to Bare `choom` starts a fresh blank session. `--resume <value>` passes
`claude --resume <value>` to rejoin a prior session by its session id. through as `claude --resume <value>` to rejoin a prior session by its
(It is deliberately NOT passed as `claude --continue <value>` — claude's session id — the flag name deliberately matches the claude flag it maps
own `--continue` is a bare flag that takes no argument and resumes the to. (choom never uses claude's `--continue`: that's a bare flag that
cwd's *latest* session, i.e. the harness's; a value after it would be takes no argument and resumes the cwd's *latest* session, i.e. the
consumed as the first prompt, silently poking the live harness session.) harness's; a value after it would be consumed as the first prompt,
A value is required when the flag is given. Either way choom never silently poking the live harness session.) A value is required when the
collides with the harness's live session in the same project dir: the flag is given. Either way choom never collides with the harness's live
harness pins its own id via `--resume`, so a blank choom session is session in the same project dir: the harness pins its own id via
invisible to it. The container must be running. `--resume`, so a blank choom session is invisible to it. The container
must be running.
choom reproduces the harness's own claude invocation so the operator choom reproduces the harness's own claude invocation so the operator
lands in a faithful copy of the agent's environment: lands in a faithful copy of the agent's environment:

View file

@ -112,20 +112,20 @@ enum Cmd {
/// ///
/// Runs claude as the agent user from its state dir with the harness's /// Runs claude as the agent user from its state dir with the harness's
/// settings / MCP / system prompt. Bare `choom <name>` is a fresh /// settings / MCP / system prompt. Bare `choom <name>` is a fresh
/// session; `--continue <session-id>` rejoins a prior one. Never /// session; `--resume <session-id>` rejoins a prior one. Never
/// collides with the harness's live session. Requires root + a running /// collides with the harness's live session. Requires root + a running
/// container. See `docs/tools/hivectl.md` (Choom) for details. /// container. See `docs/tools/hivectl.md` (Choom) for details.
Choom { Choom {
/// Agent name (e.g. `damocles`, `iris`). /// Agent name (e.g. `damocles`, `iris`).
name: String, name: String,
/// Resume a prior claude session by its session id, passed /// Resume a prior claude session by its session id, passed
/// through as `claude --resume <value>` (claude's own /// through as `claude --resume <value>` (claude's `--continue`
/// `--continue` takes no value — it resumes the cwd's latest /// takes no value — it resumes the cwd's latest session, which
/// session, which is the harness's, so choom never uses it). /// is the harness's, so choom never uses it; this flag matches
/// Omit for a fresh blank session. A value is required when /// the claude flag it maps to). Omit for a fresh blank session.
/// the flag is given. /// A value is required when the flag is given.
#[arg(long = "continue", value_name = "SESSION")] #[arg(long = "resume", value_name = "SESSION")]
continue_session: Option<String>, resume_session: Option<String>,
}, },
/// Stop containers hive-wide in one operator action. Bare `hivectl /// Stop containers hive-wide in one operator action. Bare `hivectl
/// stop` stops **everything** — all sub-agents plus the ci, forge, /// stop` stops **everything** — all sub-agents plus the ci, forge,
@ -634,8 +634,8 @@ async fn main() -> Result<()> {
}, },
Cmd::Choom { Cmd::Choom {
name, name,
continue_session, resume_session,
} => choom(&name, continue_session.as_deref()), } => choom(&name, resume_session.as_deref()),
Cmd::Quota { cmd } => match cmd { Cmd::Quota { cmd } => match cmd {
QuotaCmd::Enable => quota_enable().await, QuotaCmd::Enable => quota_enable().await,
QuotaCmd::Show { name } => quota_show(name.as_deref()).await, QuotaCmd::Show { name } => quota_show(name.as_deref()).await,
@ -1034,7 +1034,7 @@ fn agent_exists(name: &str) -> Result<bool> {
/// live harness session). See `docs/tools/hivectl.md` (Choom) for the /// live harness session). See `docs/tools/hivectl.md` (Choom) for the
/// full rationale. Inherits the caller's PTY; requires root + a running /// full rationale. Inherits the caller's PTY; requires root + a running
/// container. /// container.
fn choom(name: &str, continue_session: Option<&str>) -> Result<()> { fn choom(name: &str, resume_session: Option<&str>) -> Result<()> {
if !agent_exists(name)? { if !agent_exists(name)? {
bail!("no such agent: '{name}' (no state dir under /var/lib/hyperhive/agents/)"); bail!("no such agent: '{name}' (no state dir under /var/lib/hyperhive/agents/)");
} }
@ -1047,18 +1047,18 @@ fn choom(name: &str, continue_session: Option<&str>) -> Result<()> {
let state_dir = format!("/agents/{name}/state"); let state_dir = format!("/agents/{name}/state");
// Per-turn config the harness writes; matches `paths::config_dir()`. // Per-turn config the harness writes; matches `paths::config_dir()`.
let cfg = "/run/hive-config"; let cfg = "/run/hive-config";
// `--continue <value>` maps to `claude --resume <value>` — claude's // `--resume <value>` passes through as `claude --resume <value>` —
// own `--continue` is a bare flag (no argument): passing a value // the rejoin-by-id surface. (claude's `--continue` is a bare flag
// after it made claude resume the cwd's latest session and treat the // that resumes the cwd's latest session — the harness's — and would
// value as the first PROMPT, silently poking the harness session. // consume a trailing value as the first PROMPT; choom never uses
// `--resume <session-id>` is the actual rejoin-by-id surface. The // it.) The value is single-quoted into the shell script, so reject
// value is single-quoted into the shell script, so reject an // an embedded single quote (the only char that breaks
// embedded single quote (the only char that breaks single-quoting) // single-quoting) to rule out injection — session ids never
// to rule out injection — session ids never contain one. // contain one.
let session_arg = match continue_session { let session_arg = match resume_session {
Some(val) => { Some(val) => {
if val.contains('\'') { if val.contains('\'') {
bail!("invalid --continue value '{val}': must not contain a single quote"); bail!("invalid --resume value '{val}': must not contain a single quote");
} }
format!("set -- --resume '{val}';") format!("set -- --resume '{val}';")
} }