v0.2.0
Immutable
release. Only release title and notes can be modified.
0.2.0 (2026-05-27)
Features
- add --no-status flag to task list for fast completions (d025717)
- add (mostly idempotent) agent reinit command to cli (3c62062)
- add a proper claude plugin option for installing nerf tools (b35b733)
- add agent exec command (17dad70)
- add agent exec command for non-interactive remote execution as agent user (1dabed9)
- add agent socket infrastructure and refactor task session creation (ea95339)
- add agent templates (f24fba6)
- add apt support for getting tenv via cloudsmith (13678d2)
- add choose, pause, prompt_secret to output handler (0ea9b28)
- add claude code plugin for nerf tools (6b977bc)
- add claude_install flag and validate marketplace/plugin dependencies (36dabd5)
- add config edit command (62cb1c8)
- add config sync-vscode-workspaces command (ce70a1a)
- add decoupled warning mechanism with DI and migrate all callsites (d98184b)
- add hard timeout to run_detached and set 10min limit for Lima provisioning (06e92ef)
- add INFO status for non-applicable checks, stop warning on missing platforms (e078dc5)
- add liveness infrastructure -- PID checks, health checks, force kill (Phase 2) (e341eb2)
- add mise support (89ad43f)
- add nerf-specific env vars when nerf is installed (78228ad)
- add output.confirm for presentation-agnostic yes/no prompts (f4fcef9)
- add output.prompt for string input collection (a3223e4)
- add output.warn DI mechanism and migrate all warning callsites (339ad79)
- add Proxmox VM provisioner (4351ed1)
- add Proxmox VM provisioner (fa0b306)
- add repo support for dotfiles (d810535)
- add run_new method with sudo and tty parameters (6a8309f)
- add session repair command for PID recovery (Phase 4) (22f4404)
- add session restart-all command (25e954e)
- add ssh logging to lima provisioning (f254894)
- add stale socket cleanup on vm reinit and agent reinit (859318b)
- add starship user installer to catalog (8b52275)
- add tasks (61a9aa0)
- add use-nerf-commands rule to nerf install (1990fe8)
- add uv user installer to catalog (0803283)
- add vm backup command (ad789ed)
- add vm exec command (8d4b816)
- add vm exec command for non-interactive remote execution (6cc26d5)
- add vm port-forward to cli (db8e571)
- add vm rekey command for switching Tailscale accounts (bd8f1f1)
- add warnings fixture for tests, migrate config.py to output.warn (1a6fe15)
- add workspace and task describe commands (558d1a9)
- add workspace rehome command to move on vm filesystem (2295873)
- align workspace shell/console with vm approach (accf0f0)
- allow creating workspace with task (38c908c)
- batch stop/restart (--all, --all-stopped) with --vm/--workspace filters (324d7ba)
- Claude Code marketplace and plugin support in templates (d82573a)
- clean up vm handling of agents and tasks (fec6506)
- cli: add comment above Include directive in SSH config (5441d33)
- cli: add config sync-ssh-config command to rebuild SSH config on demand (dd9b615)
- cli: add test field to install commands for skip-if-installed (0255c45)
- cli: add test field to install commands for skip-if-installed checks (47dab73)
- cli: integrate nerf tools into VM init via config (dfb26fd)
- cli: manage SSH config via config.d with configurable host prefix (14a2880)
- cli: move init to config init, add config sample (88b9484)
- cli: move init to config init, add config sample (96fad41)
- cli: replace test with test_exec/test_file/test_dir, add fnm and unzip (6f38492)
- cli: replace test with test_exec/test_file/test_dir, add fnm and unzip (968e471)
- cli: resilient provisioning with nohup detached execution (6fe4cef)
- cli: resilient provisioning with nohup detached execution (d9f06b3)
- complete agents (42f4e12)
- default workspaces to /opt/agentworks with config option (3bbc042)
- detach Azure public IP after provisioning and poll for Tailscale stability (0761ad9)
- ditch rules as plugins don't support them (03937e4)
- drop cached status column, add PID column and SessionHealth enum (Phase 1) (4687276)
- enhancements to nerfctl grant capabilities including skill mapping for easy ux (a2f23f6)
- ensure logging across all operations (90cd0c8)
- force explicit admin vs agent selection for new tasks (6f899e9)
- implement optional mise pruning and clarify idempotency (f0162f7)
- implement vm templates (lock og sdd) (9e4ac61)
- improve vm backup with single zstd archive and reliable detached execution (7b9d72a)
- improve vm backup with single zstd archive, progress reporting, and reliable detached execution (21d6849)
- improve vm describe with live resources (9643e48)
- install nerfctl tools along with nerf commands (1e6022c)
- integrate agent socket setup into VM init and agent provisioning (dbc9399)
- migrate all session commands to health-based liveness model (Phase 3) (bd56d71)
- offer to delete auto-created workspace upon only task deletion (ffb52c7)
- Phase 6 -- unified status model (has-session primary, boot_id, session type dispatch) (4d7024f)
- protect vm deletions based on tasks (8f91cdc)
- robust ssh logging (f9b715b)
- run agent tmux sessions as the agent user via per-task sockets (9cc13f7)
- run dist-upgrade during bootstrap to keep base image current (81d134b)
- set consistent VM hostname as <platform>--<vm_name> (0473f13)
- show tasks and agents in vm describe (97f53b4)
- support claude code marketplaces and plugins in admin and agent templates (47f1c93)
- task enhancements and fixes (6761f82)
- task restart impl (079aacf)
- thread socket paths through task manager, console, and tmuxinator (160e70d)
- unified output module with handler protocol and exception hierarchy (0c8bd05)
- update nerf skills to reference nerf env vars (7ce3996)
- upgrade to nerftools 1.0.0 and use default plugin metadata (4be19d2)
- use consistent table formatting for workspaces vs tasks (96530ed)
- use native provisioning and add swap support (c393bd9)
- verbose force-kill output (SIGTERM, escalation, socket cleanup) (ec86990)
- verbose stop output (C-c, grace period, survivors, force-kill escalation) (48a5ff1)
- vm rekey prints env key detection, add --ignore-env flag (675c41b)
- warn about broken/unknown sessions at bottom of session list (b82e9d0)
- warn when agent task is found on legacy default server (4d68b2c)
- workspace copy (dde6c28)
- workspace repair command (52ab828)
Bug Fixes
- add 10-minute timeout to dist-upgrade during bootstrap (7513a62)
- add get_warn_handler and restore previous handler in test fixture (c605c29)
- add indent param to detail, Ctrl-C handling in confirm/prompt_secret (260a7a3)
- add logger redaction and IP validation in _join_tailscale (8dd5223)
- add migration guard for legacy agent sessions without socket_path (933c35c)
- add SSH non-interactive options to vm exec (33e8417)
- add success message for agent git safe.directory setup (bf3649a)
- address 5 PR review items -- error context, EOF handling, progress API (0065881)
- address Copilot PR review feedback (f8442eb)
- address Copilot review -- PID parsing, force_kill return, CLI validation, test patterns, rehome (bee6665)
- address PR feedback on Proxmox provisioner (c4955fd)
- address PR review - use custom for catalog sources, fix proxmox hasattr, align terminology (8b208f4)
- address PR review -- nohup ordering, auth key quoting, IP validation (95c264d)
- address PR review -- remove backward compat, guard division, raise on failure (6a60510)
- address PR review -- robust find -exec, merge split imports (02fd2ab)
- address PR review -- safer return type, broader cspell glob (8f86d56)
- address PR review -- ValidationError, error context in exceptions, UserAbort on Ctrl-C (c492952)
- address PR review -- WSL2 support, quiet flag, resilient output read, test (5eb2b27)
- address PR review comments - catalog terminology, UserConfig alias, [user] section backward compat (bca0451)
- address PR review feedback from Copilot (89b0db6)
- admin-mode health (session-ended vs BROKEN), sudo on tmux cmds, delete UNKNOWN handler, test annotations (5567a2e)
- allow empty message (9387992)
- allow for retries on tailscale echo test (0ae2505)
- allow inheriting from undefined default templates (1fcb257)
- always verify SSH connectivity after rekey, not just with --wait-for-share (48fb445)
- attach logger to ExecTarget in _create_agent_on_vm, add migration tests (d77dcb3)
- avoid redundant stdout.strip() calls in IP validation (6d1cabf)
- avoid zsh brace parsing issue in ensure_agent_socket_root (4f94915)
- Azure admin_exec_target used stale config.user instead of config.operator (89ae6ef)
- backfill socket_path on restart for migrated sessions (de0ce3e)
- backup: address PR review - mktemp staging, kill on interrupt, proxy_jump, archived_paths in manifest, test coverage (97e11a1)
- backup: create detached dir as admin so run_detached can scp wrapper script (e08338d)
- backup: secure mktemp -d for run_detached base, rename scp_base_args public, assert success in force_tty test (3f81ad2)
- batch quoting, ensure_pid consistency, rehome strictness, admin PID safety, status-aware delete (54f2761)
- batch status checks per VM (not per workspace) with parallel execution (62a60f9)
- batch stop/restart error on unknown sessions after auto-repair (34a37eb)
- be sure to logs timeouts (fbc117a)
- best-effort PID capture (check=False), document PID reuse non-goal with math (97d884c)
- boot_id truthiness -> is not None, cache _get_boot_id per target (37d547b)
- broken session warning wording (2ee5af0)
- BrokenSessionError replaces string matching, require boot_id with positive PID (604e4cc)
- catch ConfigError at top level for clean error output (fbc60e6)
- check both socket and default server for legacy session migration (b92ca8b)
- check for existing socket on session create and clean up or fail (37af519)
- check force_kill return in delete paths, fix UNKNOWN messages and list display, update docstring (ee1c74d)
- check kill_session return in restart path (e557adb)
- clean up agent socket after successful stop (43fba5e)
- clean up azure start/stop logic (6b10ffb)
- clean up failed init prompt (7457d94)
- clean up waiting for tailscale reconnect on azure public ip operations (d7afe62)
- cli: address PR feedback for resilient provisioning (17c9ed5)
- cli: address PR review comments on test_exec/test_file/test_dir (19bf95a)
- cli: address PR review feedback for SSH config (35917af)
- cli: address second round of PR feedback (bdbcde6)
- cli: call nerftools Python API directly instead of subprocess (281dc1a)
- cli: check for limactl before local provisioning, suggest --vm-host (4112cd7)
- cli: clean up provisioning console output, suppress verbose lima logs (2b32db2)
- cli: co-locate config commands, fix trailing newline in sample output (b6a4472)
- cli: expand tilde to $HOME in test paths so shell expansion works (49c42e8)
- cli: fix nerf dir permissions and double-sudo on VM deploy (70f586c)
- cli: fix sudo escalation in nerf tools deploy (f20249f)
- cli: log full traceback on vm create errors for debugging (96b0b91)
- cli: rebuild SSH config after DB delete so deleted VM is excluded (2549c28)
- cli: remove rsync dependency -- use copy_dir_to (tar+scp) for all dir transfers (5624b6d)
- cli: run test_exec checks in login shell so PATH additions are visible (91be879)
- cli: separate error handling for provisioning, init, and post-init (7fc269b)
- cli: set +x on nerf scripts and add zsh PATH support (2965636)
- cli: use Command result type for PS subcommand completions to suppress file fallback (a55a463)
- cli: use forward slashes in SSH config paths for Windows compatibility (019c8ed)
- cli: use interactive login shell for test_exec checks (-lic not -lc) (a0136f1)
- cli: use short timeout for install test checks, handle timeout gracefully (ab04120)
- cli: use tilde for home directory in SSH config paths (b1f0696)
- cli: warn on unexpected keys in vm.config and agent.config sections (359874e)
- compute socket_path before INSERT, add constraint tests (9c22b40)
- confirm before force-kill in delete, _get_boot_id returns None on failure, get_tmux_server_pid validates > 0 (edc466c)
- consistent singular labels in doctor summary (f6d8df8)
- Copilot round 2 -- auto-repair in batch paths, SSH logger, honest UNKNOWN on ambiguous recovery (d121b06)
- correct E501 line-length on session restart-all workspace option (8e7ab7c)
- correct missing force_tty logic (b8b18b6)
- decouple _check_completions from CLI import, mark smoke test as integration (06b43fe)
- delete uses prompts for running/unknown, --force only for BROKEN (2eb9acb)
- derive socket path for migrated agent sessions with NULL socket_path (0a1405e)
- detect SSH transport failure (returncode 255) in has-session checks (025a057)
- disable git safe directory failures by default (aeaf101)
- distinguish unknown (NULL) from known-stopped (PID=-1) sessions (13ebb20)
- docstring inaccuracy (6c89ef7)
- doctor: don't warn on false file perms for ssh key on windows (8da3431)
- don't output log for successful reinit (cf7d7df)
- don't warn on missing socket dir on vm create (only reinit) (dc3f529)
- dont force tty for detached ops (fd3f757)
- ensure acl package is installed and delete workspaces as root (8590dc7)
- ensure existing apt sources are correct (e10d4eb)
- ensure we are redacting secrets in vm reinit logs (bd6688f)
- ensure_pids_batch catches SSH errors per-VM, rehome wraps status check errors (ac96ee1)
- explicitly remove tmux socket file on session delete (bae1e88)
- fix agent shell with workspace arg (f27ea22)
- fix comment on socket test (86a5cc6)
- fix doctor for agent git creds (e327c82)
- fix inheritence to match adr (5b46ba9)
- fix nerf home and claude plugin permissions (b30d20f)
- fix other windows character encoding issues (1209f2e)
- fix two rename bugs and deduplicate describe_session status reconciliation (e9c5b55)
- fix windows-specific test issues (7bc8a9f)
- fix workspace copy and deletion (736caab)
- fix workspace rehome and create filesystem permissions (628f355)
- fold tar failure context into BackupError instead of stdout detail (3df0a9e)
- force an interactive shell for tasks (d68dcd0)
- force task session to resize based on latest attached client (71207ce)
- force tty for windows (e20d88b)
- force utf8 encodings to avoid windows charset issues (4917860)
- fully decouple doctor from CLI, consolidate config error, CI-level test filtering (feca4c5)
- guard all update_session_pid calls against None boot_id, remove stale comment (177eebb)
- handle EOF/Ctrl-C in default handler, ValidationError for choose, consistent output usage (0b80513)
- handle existing dotfiles clone on agent reinit (0df9570)
- hide stale PID in session describe (only show if current boot) (004b9e1)
- idempotently ensure that socket directories are in place for session ops (5012a86)
- include error in claude check warning, add sample config notes, add tests (afd03a7)
- include exception in completions warning, align labels, exclude integration tests (c20ecfa)
- include info count in doctor summary (742b8d8)
- incorporate pr feedback (0cc7026)
- increase timeout and add retries for resource fetch (b7e82d7)
- kill agent socket sessions during workspace delete (a17955b)
- lingering unit test and lint errors (3d4a90f)
- load creds (inc. prompting) before creating agent, same as vm (2ce2d63)
- make all create commands consistent w.r.t. prompting for targets and non-interactive behavior (7dfe803)
- make run_detached fully SSH-resilient end-to-end (ae9df9a)
- move ipaddress import to function/file top-level per convention (5a2e5b3)
- null boot_id triggers UNKNOWN and auto-repair (both pid + boot_id required) (4691ef0)
- only remove socket file after confirming tmux server has exited (f154a72)
- only remove socket when post-delete status is definitively STOPPED (0e0aa9d)
- pass args directly to ssh instead of shlex.join (07736cc)
- PID validation, boot_id cache failures, kill_session return checks, stale terminology (a58fe2c)
- PID_STOPPED excluded from unknown detection in batch stop/restart (f11a99e)
- PID_STOPPED is definitively stopped -- skip repair, show stopped not unknown (ebd6403)
- preserve arg quoting via shlex.join, pass single-string commands as-is (9871835)
- prevent cloud-init for regenerating ssh keys on vm stop/start (7ce36de)
- properly handle multiple git creds per provider (241c4cb)
- properly report config issues in doctor (e8e9261)
- protect agent deletion and clean up task/agent tables (e34ef6a)
- raise ProxmoxAPIError on unexpected network-get-interfaces shape (5e1983a)
- recheck status after failed kill (race condition), check kill return in delete_session (df9c3f4)
- reconcile stopped tasks back to running when session is alive (4f0428c)
- record vm template in db and show in command output (92eb8f5)
- rekey uses run_detached for resilient logout+rejoin on Azure (fae1d7d)
- rekey uses simple synchronous run, not run_detached (03acbb2)
- reliable rekey sequence -- restart, logout, login, restart with stabilization pauses (cdd7a00)
- reliable rekey sequence for Azure and Lima VMs (cef6a6b)
- remove ANSI escape codes from prompt_secret masking (819511d)
- remove boot_id cache, use sudo=True for socket rm, validate all PID values in DB, stale comment (21f34ba)
- remove claude from sample user_install_commands, add config validation tests (1d4a8ef)
- remove dead _effective_socket_path, fix ensure_pids_batch re-fetch and ambiguity, SSH error handling (020cf6c)
- remove marketplace prior to installing for nerf claude plugin (0810e30)
- remove stale sample config, log claude check, add agent template test (27cc6bc)
- remove sudo from tmux session commands (BROKEN detection needs real permissions), fix kill propagation (abd9719)
- rename catalog local vars to avoid ambiguous user terminology (c90c269)
- rename prompt_bool back to confirm, handle Ctrl-C in choose (ff16620)
- rename task to session in vm backup module (2367962)
- replace warnings.warn with stderr print for clean user-facing config warnings (3f1cb41)
- resolve all pre-existing lint, type, spelling, and markdown errors (234096f)
- respect dotfiles ref on reinit pull path (f002687)
- restart --all is atomic -- cancel aborts entirely, not partial (27afff2)
- restore indent=2 on backup archive path details (2a32f0d)
- retry message wording, extract stabilize_secs constant (f1a25e5)
- run tailscale logout on azure via nohup (21bb259)
- run task commands in a login shell (cf98a40)
- separate --yes (skip prompts) from --force (kill broken) on restart (caf17b6)
- separate file and dir acls workspace repair and rehome (608b4d5)
- set SGID on workspace subdirectories for correct group inheritance (016893b)
- shell quoting, type validation, and consistent config issue reporting (9b31d55)
- show '-' for sessions with no status available (VM unreachable) (0f92fb3)
- show agent name in session list mode column (789547f)
- skip BROKEN without force, abort delete on unstoppable sessions, safe survivor check (3725798)
- strict dispatch in batch_check_status, PID capture is best-effort (no orphaned sessions) (dfe56d4)
- stub Proxmox admin_exec_target with NotImplementedError (1067c18)
- sudo on socket existence check, tailor --force hint, validate socket path prefix before rm (8b701a6)
- suppress legacy warning during stop and restart (fd8d30d)
- supress socket dir warning on new stuff (ead3e00)
- supress socket dir warning on new stuff (df4d649)
- surface config issues as warnings via load_config(warn_issues=True) (6cf4078)
- type _check_config as Config, add doctor unit tests (c4705e6)
- TyperHandler.choose re-prompts on invalid input instead of exiting (e3e49df)
- UNKNOWN when boot_id unreadable (no unsafe BROKEN), batch boot_id handling, tests for edge cases (6614db7)
- use /proc for PID liveness (no sudo needed), catch active-socket error in restart (073d341)
- use direct SSH subprocess and variadic args for vm exec (e5ba383)
- use double-dash separator in migration for collision safety and tmux compatibility (e658c9e)
- use force-confnew instead of force-confold for fresh VMs (4ab92de)
- use ipaddress.IPv4Address for strict IP validation in rekey and _join_tailscale (3c3ddfc)
- use mode 2771 on socket root so agents can traverse to their own subdirectory (034915d)
- use noninteractive apt and force-confold to prevent dpkg prompts (f45bc5f)
- use per-command sudo calls and add run_as_root_multi helper (47b6d0e)
- use sudo -n su --login for correct agent shell environment (0936e2a)
- use sudo for chmod on agent-owned socket after session creation (36186b5)
- use sudo for has-session and sg for attach in console wrappers (0e8ec79)
- use sudo for non-interactive tmux operations on agent sockets (263450b)
- use usermod to set shell and avoid password prompt (172cceb)
- verify PID dead before socket cleanup, warn about unknown sessions in stop --all (e840445)
- warn about unknown sessions in list output, suggest repair (fc7a0a3)
- warn instead of fail when agent dotfiles pull has local changes (a008341)
- warn on usermod failure in ensure_agent_socket_root fast path (b535ade)
- workspace repair bug regarding group ownership (1666788)
- wrap compound shell commands in sh -c for sudo compatibility (70e7fae)
Performance Improvements
- batch C-c then single grace period for stop --all (45e6315)
Reverts
- remove sg/sudo workarounds from console wrappers (76d8e10)
Documentation
- add missing proxmox section to config reference in README (cd8ba1f)
- add SSH to Tightly Integrated Tools section (e70d82c)
- align all --force/--yes semantics in code, SDD, and help text (51a99b5)
- comment explaining remaining typer.echo in session_logs (4aacc64)
- doc cleanup (8ebca80)
- explain C-c vs kill-session tradeoff in stop path (4342fcf)
- generalize vm rekey description beyond account switching (cecf7ab)
- improve readme with additional context (1d1c5ca)
- move Tailscale and tmux content into Tightly Integrated Tools section (a32c4b1)
- note typer.echo layering violation as future cleanup (d922ad1)
- remote-exec: document as_root preference and add timeout test (c227746)
- rewrite README and completions for task-to-session rename (52e1883)
- update docs based on latest changes (1f1a8ff)