agentworks-cli 0.5.0__tar.gz → 0.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/CHANGELOG.md +114 -0
  2. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/PKG-INFO +214 -68
  3. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/README.md +213 -66
  4. agentworks_cli-0.7.0/agentworks/agents/manager.py +1564 -0
  5. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/agents/templates.py +5 -9
  6. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/_app.py +10 -11
  7. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/_errors.py +8 -2
  8. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/__init__.py +2 -0
  9. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/doctor.py +2 -0
  10. agentworks_cli-0.7.0/agentworks/cli/commands/env.py +79 -0
  11. agentworks_cli-0.7.0/agentworks/cli/commands/secret.py +30 -0
  12. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/vm.py +18 -2
  13. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/completions/spec.py +6 -0
  14. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/config.py +410 -41
  15. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/doctor.py +123 -12
  16. agentworks_cli-0.7.0/agentworks/env/__init__.py +34 -0
  17. agentworks_cli-0.7.0/agentworks/env/compose.py +63 -0
  18. agentworks_cli-0.7.0/agentworks/env/entry.py +32 -0
  19. agentworks_cli-0.7.0/agentworks/env/identity.py +129 -0
  20. agentworks_cli-0.7.0/agentworks/env/merge.py +49 -0
  21. agentworks_cli-0.7.0/agentworks/env/show.py +425 -0
  22. agentworks_cli-0.7.0/agentworks/env_compat.py +53 -0
  23. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/errors.py +32 -0
  24. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/base.py +15 -7
  25. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/output.py +30 -0
  26. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/remote_exec.py +7 -7
  27. agentworks_cli-0.7.0/agentworks/sample-config.toml +396 -0
  28. agentworks_cli-0.7.0/agentworks/secrets/__init__.py +35 -0
  29. agentworks_cli-0.7.0/agentworks/secrets/base.py +197 -0
  30. agentworks_cli-0.7.0/agentworks/secrets/env_var.py +65 -0
  31. agentworks_cli-0.7.0/agentworks/secrets/inspect.py +142 -0
  32. agentworks_cli-0.7.0/agentworks/secrets/orchestration.py +172 -0
  33. agentworks_cli-0.7.0/agentworks/secrets/prompt.py +60 -0
  34. agentworks_cli-0.7.0/agentworks/secrets/resolver.py +214 -0
  35. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/sessions/console.py +17 -13
  36. agentworks_cli-0.7.0/agentworks/sessions/manager.py +2006 -0
  37. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/sessions/multi_console.py +697 -436
  38. agentworks_cli-0.7.0/agentworks/sessions/multi_console_layout.py +435 -0
  39. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/sessions/templates.py +4 -3
  40. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/sessions/tmux.py +232 -98
  41. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/sources.py +8 -7
  42. agentworks_cli-0.7.0/agentworks/ssh.py +360 -0
  43. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/ssh_config.py +49 -6
  44. agentworks_cli-0.7.0/agentworks/transports/__init__.py +255 -0
  45. agentworks_cli-0.7.0/agentworks/transports/_shared.py +24 -0
  46. agentworks_cli-0.7.0/agentworks/transports/base.py +219 -0
  47. agentworks_cli-0.7.0/agentworks/transports/lima.py +161 -0
  48. agentworks_cli-0.7.0/agentworks/transports/remote_lima.py +165 -0
  49. agentworks_cli-0.7.0/agentworks/transports/ssh.py +293 -0
  50. agentworks_cli-0.7.0/agentworks/transports/wsl2.py +177 -0
  51. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/backup.py +130 -117
  52. agentworks_cli-0.7.0/agentworks/vms/base.py +122 -0
  53. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/bootstrap_script.py +14 -7
  54. agentworks_cli-0.7.0/agentworks/vms/hardening.py +251 -0
  55. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/initializer.py +660 -303
  56. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/manager.py +384 -202
  57. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/azure.py +60 -35
  58. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/lima.py +15 -11
  59. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/proxmox.py +10 -9
  60. agentworks_cli-0.7.0/agentworks/vms/provisioners/wsl2.py +629 -0
  61. agentworks_cli-0.7.0/agentworks/vms/tailscale_dns.py +271 -0
  62. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/templates.py +6 -24
  63. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/workspaces/backends/vm.py +7 -11
  64. agentworks_cli-0.7.0/agentworks/workspaces/manager.py +1193 -0
  65. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/workspaces/templates.py +6 -1
  66. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/pyproject.toml +1 -2
  67. agentworks_cli-0.7.0/tests/conftest.py +229 -0
  68. agentworks_cli-0.7.0/tests/test_agents.py +176 -0
  69. agentworks_cli-0.7.0/tests/test_authorized_keys.py +234 -0
  70. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_bootstrap_script.py +17 -17
  71. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_completions.py +2 -0
  72. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_config.py +14 -4
  73. agentworks_cli-0.7.0/tests/test_config_env_and_secrets.py +545 -0
  74. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_consoles.py +80 -308
  75. agentworks_cli-0.7.0/tests/test_consoles_layout.py +338 -0
  76. agentworks_cli-0.7.0/tests/test_consoles_restore.py +275 -0
  77. agentworks_cli-0.7.0/tests/test_doctor_env_and_secrets.py +351 -0
  78. agentworks_cli-0.7.0/tests/test_env_compat.py +125 -0
  79. agentworks_cli-0.7.0/tests/test_env_compose.py +97 -0
  80. agentworks_cli-0.7.0/tests/test_env_entry.py +36 -0
  81. agentworks_cli-0.7.0/tests/test_env_identity.py +134 -0
  82. agentworks_cli-0.7.0/tests/test_env_merge.py +99 -0
  83. agentworks_cli-0.7.0/tests/test_env_show.py +307 -0
  84. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_error_wrapper.py +21 -34
  85. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_initializer.py +391 -0
  86. agentworks_cli-0.7.0/tests/test_initializer_env_fragments.py +435 -0
  87. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_remote_exec.py +1 -1
  88. agentworks_cli-0.7.0/tests/test_sample_config.py +97 -0
  89. agentworks_cli-0.7.0/tests/test_secrets_base.py +114 -0
  90. agentworks_cli-0.7.0/tests/test_secrets_eager_resolve.py +1382 -0
  91. agentworks_cli-0.7.0/tests/test_secrets_env_var.py +145 -0
  92. agentworks_cli-0.7.0/tests/test_secrets_inspect.py +193 -0
  93. agentworks_cli-0.7.0/tests/test_secrets_orchestration.py +435 -0
  94. agentworks_cli-0.7.0/tests/test_secrets_prompt.py +120 -0
  95. agentworks_cli-0.7.0/tests/test_secrets_resolver.py +361 -0
  96. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_session_liveness.py +47 -6
  97. agentworks_cli-0.7.0/tests/test_session_transport.py +346 -0
  98. agentworks_cli-0.7.0/tests/test_sessions_tmux_create.py +268 -0
  99. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_ssh_config.py +132 -0
  100. agentworks_cli-0.7.0/tests/test_ssh_logger.py +72 -0
  101. agentworks_cli-0.7.0/tests/test_ssh_set_env.py +192 -0
  102. agentworks_cli-0.7.0/tests/test_tailscale_dns.py +446 -0
  103. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_tmuxinator.py +1 -1
  104. agentworks_cli-0.7.0/tests/test_vm_shell_provisioner.py +615 -0
  105. agentworks_cli-0.7.0/tests/test_wsl2_keepalive.py +341 -0
  106. agentworks_cli-0.7.0/tests/test_wsl2_paths.py +62 -0
  107. agentworks_cli-0.7.0/tests/transports/__init__.py +0 -0
  108. agentworks_cli-0.7.0/tests/transports/conftest.py +30 -0
  109. agentworks_cli-0.7.0/tests/transports/test_abc.py +88 -0
  110. agentworks_cli-0.7.0/tests/transports/test_factories.py +409 -0
  111. agentworks_cli-0.7.0/tests/transports/test_lima.py +136 -0
  112. agentworks_cli-0.7.0/tests/transports/test_remote_lima.py +168 -0
  113. agentworks_cli-0.7.0/tests/transports/test_ssh.py +262 -0
  114. agentworks_cli-0.7.0/tests/transports/test_wsl2.py +164 -0
  115. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/uv.lock +53 -114
  116. agentworks_cli-0.5.0/agentworks/agents/manager.py +0 -1230
  117. agentworks_cli-0.5.0/agentworks/nerf-config.yaml +0 -16
  118. agentworks_cli-0.5.0/agentworks/sample-config.toml +0 -311
  119. agentworks_cli-0.5.0/agentworks/sessions/manager.py +0 -1508
  120. agentworks_cli-0.5.0/agentworks/ssh.py +0 -769
  121. agentworks_cli-0.5.0/agentworks/vms/base.py +0 -56
  122. agentworks_cli-0.5.0/agentworks/vms/provisioners/wsl2.py +0 -340
  123. agentworks_cli-0.5.0/agentworks/workspaces/manager.py +0 -1168
  124. agentworks_cli-0.5.0/tests/conftest.py +0 -117
  125. agentworks_cli-0.5.0/tests/test_agents.py +0 -67
  126. agentworks_cli-0.5.0/tests/test_authorized_keys.py +0 -106
  127. agentworks_cli-0.5.0/tests/test_exec_target.py +0 -151
  128. agentworks_cli-0.5.0/tests/test_nerf_plugin.py +0 -196
  129. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/.gitignore +0 -0
  130. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/.python-version +0 -0
  131. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/__init__.py +0 -0
  132. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/agents/__init__.py +0 -0
  133. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/catalog.py +0 -0
  134. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/catalog.toml +0 -0
  135. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/__init__.py +0 -0
  136. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/_entry.py +0 -0
  137. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/_helpers.py +0 -0
  138. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/_typer_output.py +0 -0
  139. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/agent.py +0 -0
  140. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/catalog.py +0 -0
  141. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/completion.py +0 -0
  142. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/config.py +0 -0
  143. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/console.py +0 -0
  144. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/session.py +0 -0
  145. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/vm_host.py +0 -0
  146. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/workspace.py +0 -0
  147. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/completions/__init__.py +0 -0
  148. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/completions/bash.py +0 -0
  149. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/completions/install.py +0 -0
  150. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/completions/powershell.py +0 -0
  151. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/completions/zsh.py +0 -0
  152. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/db.py +0 -0
  153. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/__init__.py +0 -0
  154. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/azdo.py +0 -0
  155. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/github.py +0 -0
  156. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/sessions/__init__.py +0 -0
  157. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vm_hosts/__init__.py +0 -0
  158. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vm_hosts/manager.py +0 -0
  159. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/__init__.py +0 -0
  160. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/cloud_init.py +0 -0
  161. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/__init__.py +0 -0
  162. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/proxmox_api.py +0 -0
  163. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/workspaces/__init__.py +0 -0
  164. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/workspaces/backends/__init__.py +0 -0
  165. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/agentworks/workspaces/tmuxinator.py +0 -0
  166. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/pypi-dist/.gitignore +0 -0
  167. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/__init__.py +0 -0
  168. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_catalog.py +0 -0
  169. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_cli_helpers.py +0 -0
  170. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_cloud_init.py +0 -0
  171. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_db.py +0 -0
  172. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_doctor.py +0 -0
  173. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_name_validation.py +0 -0
  174. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_proxmox_api.py +0 -0
  175. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_templates.py +0 -0
  176. {agentworks_cli-0.5.0 → agentworks_cli-0.7.0}/tests/test_vm_hosts.py +0 -0
@@ -1,5 +1,119 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.7.0](https://github.com/WayfarerLabs/agentworks/compare/v0.6.0...v0.7.0) (2026-06-24)
4
+
5
+
6
+ ### Features
7
+
8
+ * **agents:** agent shell uses direct agent SSH ([edccd6f](https://github.com/WayfarerLabs/agentworks/commit/edccd6f4a66700afa372210b30eceb676cac16af))
9
+ * **agents:** authorized_keys + operator ssh config for agent users ([7991dc3](https://github.com/WayfarerLabs/agentworks/commit/7991dc37186c59542f8e18367831b7b9878ed13d))
10
+ * **agents:** typed error on pre-rollout agent SSH + reviewer cleanups ([edc5552](https://github.com/WayfarerLabs/agentworks/commit/edc555233acf30d10b8a98075db4f5c1c065cbc8))
11
+ * **cli:** AW_-prefixed env vars with legacy fallback ([ceb9e05](https://github.com/WayfarerLabs/agentworks/commit/ceb9e057f48eca5b230618d768aee0e777cb1636))
12
+ * **cli:** AW_-prefixed env vars with legacy fallback ([62617b9](https://github.com/WayfarerLabs/agentworks/commit/62617b97e5951fa91e89a718cad5babc8ea872d4))
13
+ * **doctor:** Secrets and Env health groups (Phase 5 - FRD R6) ([8a6dbf7](https://github.com/WayfarerLabs/agentworks/commit/8a6dbf750e8c628997a723168ab706d6eb668f45))
14
+ * **doctor:** summary row for configured secret backends ([0dd4fe9](https://github.com/WayfarerLabs/agentworks/commit/0dd4fe9fdb4faa5fde7ebfcd379ee3dda71f3ae8))
15
+ * **env:** `agw env show` command (Phase 5) ([06f25b6](https://github.com/WayfarerLabs/agentworks/commit/06f25b6505c96d30cdc7a2ec2cf7ef7ee4a97860))
16
+ * **env:** env package + secrets config loaders (Phase 2) ([9c61284](https://github.com/WayfarerLabs/agentworks/commit/9c61284a5efc89c2b751a1de9e4ea182ecc83a5b))
17
+ * **env:** env vars + pluggable secret backends (env-and-secrets SDD) ([fa67409](https://github.com/WayfarerLabs/agentworks/commit/fa67409b2ec7fa48807bffcfa9987dda057141a5))
18
+ * **env:** wire env+secrets prelude into session create/restart (Phase 3) ([91f32db](https://github.com/WayfarerLabs/agentworks/commit/91f32dbcf0e758f645e026da7cbb345e014b8614))
19
+ * **provisioning:** defensive 'ensure agentworks files sourced' step ([29128aa](https://github.com/WayfarerLabs/agentworks/commit/29128aa862bf88d1ac73ed63cccfd3737779eeb8))
20
+ * **secrets:** add agw secret list for backend mapping discovery ([048f189](https://github.com/WayfarerLabs/agentworks/commit/048f189e6474a7c9eaf2c4b51f0f6ba0f1779dce))
21
+ * **secrets:** add SecretMappingError for hard-miss backends ([29823e7](https://github.com/WayfarerLabs/agentworks/commit/29823e75234a05c548bcdd4a1cd14f9c3bf6c851))
22
+ * **secrets:** eager-prompting orchestration module (Phase 6.1) ([4d28390](https://github.com/WayfarerLabs/agentworks/commit/4d28390a94163083e483d073162554969cdb67c9))
23
+ * **secrets:** eager-resolve + env threading in vm/agent shell+exec (Phase 6.5) ([423512f](https://github.com/WayfarerLabs/agentworks/commit/423512f3c49634c723bb19473303426ded49aeb6))
24
+ * **secrets:** eager-resolve in agent create/reinit (Phase 6.4) ([691d7bd](https://github.com/WayfarerLabs/agentworks/commit/691d7bd24092ad44a48464e47f4e51865b500fce))
25
+ * **secrets:** eager-resolve in console build + restore_session (Phase 6.2b) ([e0690ca](https://github.com/WayfarerLabs/agentworks/commit/e0690ca6e65a904b8d953392a6d357fdb4b92580))
26
+ * **secrets:** eager-resolve in session + console paths (Phase 6.2) ([ae6e68d](https://github.com/WayfarerLabs/agentworks/commit/ae6e68d2e72f31293edd19317c4b1158a14b62f4))
27
+ * **secrets:** eager-resolve in vm create/reinit (Phase 6.3) ([41a9d43](https://github.com/WayfarerLabs/agentworks/commit/41a9d435e90b8c57048b485f00dd521ae98344a3))
28
+ * **secrets:** Phase 1 - secrets package foundations ([1a79952](https://github.com/WayfarerLabs/agentworks/commit/1a799521c75fc40b990f825381eec0cbc595ecf6))
29
+ * **secrets:** thread env through agent setup runners (Phase 6.4b) ([e92bb4b](https://github.com/WayfarerLabs/agentworks/commit/e92bb4bb76ac9161e3d59224377d68f4ad337fac))
30
+ * **secrets:** thread env through vm provisioning runners (Phase 6.3b) ([0e2ef33](https://github.com/WayfarerLabs/agentworks/commit/0e2ef334c4ca612c313a360ed830583b77c26fca))
31
+ * **sessions:** create agent-mode tmux sessions via direct agent SSH ([389141f](https://github.com/WayfarerLabs/agentworks/commit/389141f5f5a14549b7db8541a1f33144a0fe97ca))
32
+ * **ssh:** add agent_exec_target ExecTarget builder ([8452262](https://github.com/WayfarerLabs/agentworks/commit/8452262e0c985301a81dc12574cb165d2d3ba135))
33
+ * **vm:** expose provisioner shell via 'vm shell --provisioner' ([f2ee07f](https://github.com/WayfarerLabs/agentworks/commit/f2ee07f9b91fb2a2e3d18726f0ead6963552261e))
34
+ * **vms:** apply VM hardening at vm create + vm reinit ([81b6dcf](https://github.com/WayfarerLabs/agentworks/commit/81b6dcf235e382b6b6ce4ce2b91994d8c1ee28a5))
35
+ * **vms:** deploy VM-side env-and-secrets fragments (Phase 4) ([61238b0](https://github.com/WayfarerLabs/agentworks/commit/61238b01e2d6c32be205064e1c90d815d8335a1b))
36
+ * **vms:** detect tailscaled DNS latch and abort phase B with heal hint ([3b289c8](https://github.com/WayfarerLabs/agentworks/commit/3b289c8287a6782dafe083c2b77dc0457fb5ea8f))
37
+
38
+
39
+ ### Bug Fixes
40
+
41
+ * **agents:** always write the agent's ~/.agentworks-rc.sh ([4c8f602](https://github.com/WayfarerLabs/agentworks/commit/4c8f602c8b3d81f7bab0bb89489142928a54c01a))
42
+ * **agents:** always write the agent's ~/.agentworks-rc.sh ([0f10e9c](https://github.com/WayfarerLabs/agentworks/commit/0f10e9c6e2c938db5d2d6f838060f51e586e1a9b))
43
+ * **agents:** rename stale ExecTarget annotation to Transport ([cd78049](https://github.com/WayfarerLabs/agentworks/commit/cd78049ceabd808909f2c5c4fc73c77b84c31847))
44
+ * **agents:** rename stale ExecTarget annotation to Transport ([86b0e89](https://github.com/WayfarerLabs/agentworks/commit/86b0e89cbf9a7611b85e42c4d0098aa35f534be9))
45
+ * **agents:** stop overwriting ~/.zshrc with a hardcoded PS1 ([c79a916](https://github.com/WayfarerLabs/agentworks/commit/c79a91623ad9ff2efc42d9b3ddf26c78022d3e71))
46
+ * **agents:** wrap claude/dotfiles commands in login shell for agent PATH ([0fa1cd5](https://github.com/WayfarerLabs/agentworks/commit/0fa1cd55fc756a27aee7cb77edbceeaaf617a50f))
47
+ * **agents:** wrap mise install/prune in login shell too ([aace97d](https://github.com/WayfarerLabs/agentworks/commit/aace97d2775d12afb8dd1690e5f191be7d059f10))
48
+ * **doctor:** simplify secret preview, honor prompt opt-out ([ba1f583](https://github.com/WayfarerLabs/agentworks/commit/ba1f5837e76cd85113ba9acb61ab4ac2777dc5a6))
49
+ * **env:** doctor.py legacy-aware credential check + both-set note + removal-timeline doc ([101c645](https://github.com/WayfarerLabs/agentworks/commit/101c6450039e56f685bc5023163d03329dce5664))
50
+ * **initializer:** identity-profile zsh mirror on fresh VMs ([c0cbd27](https://github.com/WayfarerLabs/agentworks/commit/c0cbd278588538dfedec0deb1561a6325cca4b6e))
51
+ * **logging:** route operation tracebacks to the per-op log ([bb7ea7e](https://github.com/WayfarerLabs/agentworks/commit/bb7ea7e3f2472f6a268bc77cb0b7f1aaf5c0ce87))
52
+ * **logging:** route operation tracebacks to the per-op log ([ec1ab02](https://github.com/WayfarerLabs/agentworks/commit/ec1ab02467e4e459210bf1dafe4f1b464115c5ba))
53
+ * **secrets:** PromptSource must respect backend_mappings.prompt=false ([bedb2ee](https://github.com/WayfarerLabs/agentworks/commit/bedb2ee6eb1655c9b0fd4ec651177bcfbbcabae0))
54
+ * **ssh:** coalesce SetEnv pairs into one -o argument ([94f54f8](https://github.com/WayfarerLabs/agentworks/commit/94f54f87364fc9942979ea86f313f05ed77a615a))
55
+ * **ssh:** dispatch interactive() across non-SSH transports ([3aa48a8](https://github.com/WayfarerLabs/agentworks/commit/3aa48a8dccd33e1596b5fbd60a83858b8fbd02a6))
56
+ * **ssh:** wrap remote-lima interactive in login shell for PATH ([3e4b83c](https://github.com/WayfarerLabs/agentworks/commit/3e4b83ce2450a07eef826ef38580d32dcbc44251))
57
+ * **transports:** default mid-create identity_file to operator key ([3b84132](https://github.com/WayfarerLabs/agentworks/commit/3b8413291240904c2463aad87e9645982c7921d3))
58
+ * **vm:** auto-attach/detach Azure public IP for 'vm shell --provisioner' ([a1621f9](https://github.com/WayfarerLabs/agentworks/commit/a1621f92fe7370502bdb71da96e802c1a0d15fe0))
59
+ * **vm:** point Proxmox provisioner-shell users at web UI serial console ([31d9045](https://github.com/WayfarerLabs/agentworks/commit/31d90458848a6341ee4690b309d7b148e2ed36bc))
60
+ * **vms:** announce DNS check before the lookup pauses ([f358898](https://github.com/WayfarerLabs/agentworks/commit/f3588986c3b6cefca8e6dc0701b9e010b7e9ff85))
61
+ * **vms:** order tailscaled after systemd-resolved to fix DNS race ([905d00a](https://github.com/WayfarerLabs/agentworks/commit/905d00a73087a0aa0c6fee385801ab40a2e2666b))
62
+ * **vms:** restore tailscale_host guard on exec_vm + round-2 review nits ([59c7d9a](https://github.com/WayfarerLabs/agentworks/commit/59c7d9a9cd47a76781ec6c140fbd72d53ea16948))
63
+ * **vms:** tailscaled DNS race fix and vm-shell provisioner flag ([dc147f8](https://github.com/WayfarerLabs/agentworks/commit/dc147f8a8d383eb0487051539cd492b896ea6805))
64
+ * **vms:** warn that heal kills SSH session over Tailscale ([8fb56b4](https://github.com/WayfarerLabs/agentworks/commit/8fb56b438ffee2140c74706d4cb5b33e7a48a24c))
65
+ * **vm:** warn instead of block on failed-init for 'vm shell' ([c84adff](https://github.com/WayfarerLabs/agentworks/commit/c84adfffd0b53e6bd012f5c0fc41401376af4434))
66
+
67
+
68
+ ### Documentation
69
+
70
+ * address Copilot feedback on PR [#107](https://github.com/WayfarerLabs/agentworks/issues/107) (proper noun, EDITOR/VISUAL, doctor scope, tmux detach hint) ([b4ed925](https://github.com/WayfarerLabs/agentworks/commit/b4ed925beb62cccbcb732dc4244d5358cdd4a3f3))
71
+ * **env:** document env + secrets in sample config and READMEs (Phase 5) ([adc32d7](https://github.com/WayfarerLabs/agentworks/commit/adc32d71b43499bebcb2328c6b73a3f9317607a0))
72
+ * move walkthrough to cli/, collapse top-level Tmux subsections ([34dbcc2](https://github.com/WayfarerLabs/agentworks/commit/34dbcc2edd52520941805256a695d8eaa9311a4d))
73
+ * rename remaining env_var references to env-var ([7ec1af8](https://github.com/WayfarerLabs/agentworks/commit/7ec1af86bb3ad528da2fa13772910cbbf4976542))
74
+ * rewrite tmux detach hint to not overpromise on prefix override ([343f729](https://github.com/WayfarerLabs/agentworks/commit/343f72959f4dd7c92c97d9e89486bf01900091ec))
75
+ * **sample-config:** #toml comment convention for uncomment-in-place ([04d6803](https://github.com/WayfarerLabs/agentworks/commit/04d6803478f7988929643bf297215809da943f1d))
76
+ * **sample-config:** inline env tables with resources, lift secrets up ([06c1c61](https://github.com/WayfarerLabs/agentworks/commit/06c1c61a50993904880141a14c5e330744db327e))
77
+ * **sdd:** address phase-7 review (tradeoffs, sync-ssh-config, SSH-alias placement) ([8e1c9bd](https://github.com/WayfarerLabs/agentworks/commit/8e1c9bd9d7da3e99fdd891a3b8e85d3ab09b29d8))
78
+ * **sdd:** direct-user-ssh-access SDD ([ef1281f](https://github.com/WayfarerLabs/agentworks/commit/ef1281fb3ed1df7bf37f0eeb7252d3a9515c76d4))
79
+ * **sdd:** drop stale nerftools references from env-and-secrets SDD ([c2b9fc4](https://github.com/WayfarerLabs/agentworks/commit/c2b9fc469bfc487c9ef90c0de961c3841590fd56))
80
+ * **sdd:** lock env-and-secrets SDD ([672b7fa](https://github.com/WayfarerLabs/agentworks/commit/672b7fa953f4815138c50da0f66654caaee5d17c))
81
+ * **sdd:** phase 7 deliverables (two ADR drafts + cli/README SSH alias surface) ([c984705](https://github.com/WayfarerLabs/agentworks/commit/c984705546e8a029d8cca916f0231562c0c1c21b))
82
+ * **secrets:** clarify when PromptSource opt-out adds value ([6bc31bf](https://github.com/WayfarerLabs/agentworks/commit/6bc31bf8a14c01026aa1904f5d8dd7111fc2b92c))
83
+ * **secrets:** tighten _agent_secret_targets docstring (Phase 6.4 polish) ([5d6b9e2](https://github.com/WayfarerLabs/agentworks/commit/5d6b9e27e3f35a4216cbebf350a2ee866d50b4ae))
84
+ * tighten READMEs to project-vs-CLI split ([2021699](https://github.com/WayfarerLabs/agentworks/commit/2021699f4f09ec7fab9cdd51eb829e960df0c851))
85
+ * tighten tmux detach hint to two lines ([4b549ce](https://github.com/WayfarerLabs/agentworks/commit/4b549ce2f810e7c1f13ef8ea58616b17e4e22aef))
86
+
87
+ ## [0.6.0](https://github.com/WayfarerLabs/agentworks/compare/v0.5.0...v0.6.0) (2026-06-06)
88
+
89
+
90
+ ### Features
91
+
92
+ * **console:** aw-session-vertical layout + focus session pane on build ([6932505](https://github.com/WayfarerLabs/agentworks/commit/6932505f78d821d1ec2ddd45cc37d74f1cedccb5))
93
+ * **console:** aw-session-vertical layout + focus session pane on build ([aa8270c](https://github.com/WayfarerLabs/agentworks/commit/aa8270cdf31df6512e95c450606056f48a91202d))
94
+ * **vms:** wrap every VM-touching command in keep_vm_active ([8fa8e46](https://github.com/WayfarerLabs/agentworks/commit/8fa8e4600abc125d6f3e1fefc36202336de9c306))
95
+ * **wsl2:** bind keepalive subprocess to Win32 Job Object for orphan-proof cleanup ([08a4833](https://github.com/WayfarerLabs/agentworks/commit/08a4833481ce2146bc784cdfd83baece39b62542))
96
+ * **wsl2:** surface idle-shutdown prevention enter/exit on the keepalive ([f41e926](https://github.com/WayfarerLabs/agentworks/commit/f41e9263976b0267f2cbe1b400177a6dbfe8d937))
97
+
98
+
99
+ ### Bug Fixes
100
+
101
+ * address Copilot review on PR [#95](https://github.com/WayfarerLabs/agentworks/issues/95) ([e45322d](https://github.com/WayfarerLabs/agentworks/commit/e45322db28b4ae9b0043699efcbbf84e4782dcc7))
102
+ * **ci:** make WSL2 keepalive code portable to the Linux CI runner ([9de3776](https://github.com/WayfarerLabs/agentworks/commit/9de377623c3207cc13330543394b3874dfeadf23))
103
+ * **ci:** satisfy lint-files and ruff on the WSL2 branch ([482646d](https://github.com/WayfarerLabs/agentworks/commit/482646dd42b7cd0d002ca2c4d836afe1bf2e90d4))
104
+ * **console:** focus session pane on restore-session no-op path too ([78dad70](https://github.com/WayfarerLabs/agentworks/commit/78dad70c7ea3905eb1ffe338011b9423c078a65e))
105
+ * **console:** hand-computed tmux layout string for exact aw-session-vertical geometry ([014613b](https://github.com/WayfarerLabs/agentworks/commit/014613ba058f4c30a8d48257eb7f00f7176209fc))
106
+ * **console:** pane-index sort + silent single-pane no-op + doc fixes ([b14ce2c](https://github.com/WayfarerLabs/agentworks/commit/b14ce2cd781733f72accf04c8e89d1e5eaf721aa))
107
+ * **wsl2:** address agentworks-reviewer feedback on PR [#95](https://github.com/WayfarerLabs/agentworks/issues/95) ([65c66cc](https://github.com/WayfarerLabs/agentworks/commit/65c66cc1b560ed660b56fa59b21fcf4c80003189))
108
+ * **wsl2:** close keepalive subprocess stderr PIPE on both exit paths ([4271772](https://github.com/WayfarerLabs/agentworks/commit/42717727e0940a043eb457383acfadf7a7c3613b))
109
+ * **wsl2:** rehabilitate broken provisioning and add platform-wide keepalive ([177edff](https://github.com/WayfarerLabs/agentworks/commit/177edffc56fa38ccb3c62b6f2e1379707dba966c))
110
+ * **wsl2:** tolerate already-dead keepalive subprocess + drop redundant local import ([67cc239](https://github.com/WayfarerLabs/agentworks/commit/67cc239ef3fbd2888ea498f6610d357f289837a3))
111
+
112
+
113
+ ### Documentation
114
+
115
+ * **console:** clarify multi_console_layout module docstring re Config dep ([6031039](https://github.com/WayfarerLabs/agentworks/commit/6031039b95f08bb55bddab211a4a72cc33c8acb5))
116
+
3
117
  ## [0.5.0](https://github.com/WayfarerLabs/agentworks/compare/v0.4.0...v0.5.0) (2026-06-05)
4
118
 
5
119
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentworks-cli
3
- Version: 0.5.0
3
+ Version: 0.7.0
4
4
  Summary: CLI for orchestrating workspace lifecycle across multiple compute targets
5
5
  Project-URL: Homepage, https://github.com/WayfarerLabs/agentworks
6
6
  Project-URL: Repository, https://github.com/WayfarerLabs/agentworks
@@ -11,7 +11,6 @@ Requires-Python: >=3.12
11
11
  Requires-Dist: azure-identity>=1.25.1
12
12
  Requires-Dist: azure-mgmt-compute>=37.0.1
13
13
  Requires-Dist: azure-mgmt-network>=29.0.0
14
- Requires-Dist: nerftools>=1.1.0
15
14
  Requires-Dist: typer>=0.24.1
16
15
  Description-Content-Type: text/markdown
17
16
 
@@ -36,11 +35,39 @@ The everyday command is `agw`. The longer form `agentworks` is also installed if
36
35
  type it out; examples throughout this document use `agw`.
37
36
 
38
37
  ```bash
38
+ # Initial setup
39
39
  agw config init # creates ~/.config/agentworks/config.toml
40
- # edit the config; at minimum set your SSH key paths
41
- agw vm create my-vm # provision + initialize a VM
42
- agw workspace create my-workspace # create a workspace on the VM
43
- agw workspace shell my-workspace
40
+ agw config edit # opens the config in your $EDITOR (or $VISUAL) to fill in required fields
41
+ agw doctor # sanity-checks installed tools, Tailscale, config validity, and the local DB
42
+
43
+ # Create a VM, workspace, agent, and session to see how the pieces fit together
44
+ agw vm create my-vm
45
+ agw workspace create my-workspace --vm my-vm
46
+ agw agent create my-agent --vm my-vm
47
+ agw session create my-session --workspace my-workspace --agent my-agent
48
+
49
+ # Attach to the session's tmux session to drive it
50
+ agw session attach my-session
51
+ # Use tmux's 'detach' command (default Ctrl-b unless overridden by config) to disconnect while
52
+ # leaving everything running on the VM.
53
+ agw session attach my-session # You'll pick up right where you left off
54
+ agw session stop my-session # Sessions can be stopped (or can exit on their own)
55
+ agw session list
56
+ agw session restart my-session
57
+ agw session attach my-session
58
+ agw session delete my-session # When you're done with it. Agent and workspace are preserved.
59
+
60
+ # Alternatively, you can create ephemeral workspaces and agents along with your sessions
61
+ agw session create my-ephemeral-session --vm my-vm --new-workspace --new-agent
62
+ agw session attach my-ephemeral-session
63
+ agw session delete my-ephemeral-session # This will prompt you to delete the associated workspace and agent, too
64
+
65
+ # Finally, create two sessions and a named console
66
+ agw session create s1 --vm my-vm --new-workspace --new-agent
67
+ agw session create s2 --vm my-vm --new-workspace --new-agent
68
+ agw console create my-console s1 s2+1 # The + syntax gives you extra shells as that agent
69
+ agw console attach my-console
70
+ agw console delete my-console # Extra shells are lost but sessions are preserved
44
71
  ```
45
72
 
46
73
  ## Prerequisites
@@ -48,7 +75,8 @@ agw workspace shell my-workspace
48
75
  - Python 3.12+ (uv will install one for you if needed)
49
76
  - [uv](https://docs.astral.sh/uv/) or [pipx](https://pipx.pypa.io/) for installation
50
77
  - [Tailscale](https://tailscale.com/) installed and connected (for VM workspaces)
51
- - One of: [Lima](https://lima-vm.io/), Azure CLI (`az`), or WSL2 (for VM provisioning)
78
+ - One of: [Lima](https://lima-vm.io/), Azure CLI (`az`), [Proxmox](https://www.proxmox.com/), or
79
+ WSL2 (for VM provisioning)
52
80
 
53
81
  ## Global Options
54
82
 
@@ -104,6 +132,14 @@ bypass the confirmation prompt.
104
132
 
105
133
  Manage virtual machines across Lima (local or remote), Azure, and WSL2.
106
134
 
135
+ > **Note on WSL2:** WSL2 distros share the Windows workstation's lifecycle. They idle-shut after
136
+ > ~60s of no `wsl.exe` activity (`vmIdleTimeout` in `.wslconfig`) and do not survive workstation
137
+ > shutdown or sleep. agentworks holds a `wsl.exe` keepalive for the duration of each VM-touching
138
+ > command, so individual `agw` operations work cleanly, but agents and sessions on WSL2 are not
139
+ > suitable for unattended background workflows. Use a different provisioner that provides true
140
+ > long-lived VMs (e.g. Lima, Azure, Proxmox, etc.) if you need a VM that survives independent of
141
+ > your workstation.
142
+
107
143
  | Command | Description |
108
144
  | ----------------------------------------- | ------------------------------------------ |
109
145
  | `agw vm create <name>` | Create a new VM (provision + initialize) |
@@ -129,6 +165,18 @@ Changes to config (new packages, different install commands, etc.) are picked up
129
165
  `vm delete` requires `--force` if the VM has workspaces, agents, or sessions. The confirmation
130
166
  message shows what will be deleted. Pass `--yes` to skip the prompt.
131
167
 
168
+ `agw vm shell` is the agentworks-wrapped entry point; for raw SSH (VS Code Remote-SSH, `scp`, etc.),
169
+ use the `awvm--<vm>` alias documented under [Direct SSH aliases](#direct-ssh-aliases).
170
+
171
+ `agw vm shell --provisioner` opens the same shell over the platform-native transport
172
+ (`limactl shell` for Lima, `wsl.exe` for WSL2, SSH via a temporarily-attached public IP for Azure)
173
+ instead of Tailscale. Useful when Tailscale itself is the thing you need to reach the VM to fix (the
174
+ issue #117 latched DNS state is the canonical case: its heal involves restarting tailscaled, which
175
+ would terminate a Tailscale-SSH session mid-sequence). On Azure, a public IP is attached for the
176
+ duration of the session and detached on exit. Proxmox isn't supported by this flag because the QEMU
177
+ guest agent's exec interface is one-shot and non-interactive; use the Proxmox web UI's serial
178
+ console (`VM > Console` in the Proxmox VE web UI) as the equivalent escape hatch.
179
+
132
180
  ### Workspaces
133
181
 
134
182
  Manage workspaces on VMs.
@@ -162,25 +210,55 @@ during deletion. Pass `--yes` to skip the confirmation prompt.
162
210
 
163
211
  Manage agents (isolated Linux users) on VMs. Agents are VM-scoped and access workspaces via grants.
164
212
 
165
- | Command | Description |
166
- | -------------------------------------------- | ------------------------------ |
167
- | `agw agent create <name> [--vm]` | Create an agent on a VM |
168
- | `agw agent list [--vm <vm>]` | List agents |
169
- | `agw agent describe <name>` | Show agent details and grants |
170
- | `agw agent reinit <name>` | Re-run agent setup |
171
- | `agw agent grant-workspaces <name> <ws>...` | Grant workspace access |
172
- | `agw agent grant-workspaces <name> --all` | Grant access to all workspaces |
173
- | `agw agent revoke-workspaces <name> <ws>...` | Revoke workspace access |
174
- | `agw agent revoke-workspaces <name> --all` | Revoke all explicit grants |
175
- | `agw agent shell <name> [--workspace <ws>]` | Shell into an agent |
176
- | `agw agent delete <name>` | Delete an agent |
213
+ | Command | Description |
214
+ | -------------------------------------------- | ---------------------------------------- |
215
+ | `agw agent create <name> [--vm]` | Create an agent on a VM |
216
+ | `agw agent list [--vm <vm>]` | List agents |
217
+ | `agw agent describe <name>` | Show agent details and grants |
218
+ | `agw agent reinit <name>` | Re-run agent setup |
219
+ | `agw agent grant-workspaces <name> <ws>...` | Grant workspace access |
220
+ | `agw agent grant-workspaces <name> --all` | Grant access to all workspaces |
221
+ | `agw agent revoke-workspaces <name> <ws>...` | Revoke workspace access |
222
+ | `agw agent revoke-workspaces <name> --all` | Revoke all explicit grants |
223
+ | `agw agent shell <name> [--workspace <ws>]` | Open an interactive shell as the agent |
224
+ | `agw agent exec <name> -- <cmd...>` | Run a one-shot command non-interactively |
225
+ | `agw agent delete <name>` | Delete an agent |
177
226
 
178
227
  `agent create <name>` takes the agent name as a required positional. Optional flags: `--vm`,
179
228
  `--template`, and `--grant-all-workspaces`.
180
229
 
230
+ `agent shell` and `agent exec` both SSH directly as the agent's Linux user. `agent shell` opens an
231
+ interactive login shell (sources the agent's profile; pass `--workspace <ws>` to `cd` into a granted
232
+ workspace first). `agent exec` runs a single command non-interactively but still wraps it in the
233
+ agent's login shell so the agent's `PATH` (mise shims, `~/.local/bin`, etc.) is in scope. Useful for
234
+ scripted invocations like `agw agent exec myagent -- claude -p "..."`.
235
+
181
236
  `agent delete` requires `--force` if the agent has running sessions. Pass `--yes` to skip the
182
237
  confirmation prompt.
183
238
 
239
+ `agw agent shell` / `agw agent exec` are agentworks-wrapped entry points; for raw SSH access to an
240
+ agent (e.g. from VS Code Remote-SSH or `scp`), use the `awagent--<agent>` alias documented under
241
+ [Direct SSH aliases](#direct-ssh-aliases).
242
+
243
+ ### Direct SSH aliases
244
+
245
+ Agentworks maintains operator-side SSH config entries for both VMs and agents under
246
+ `~/.ssh/config.d/agentworks.conf` (or inline in `~/.ssh/config` if `ssh_config_dir = false`):
247
+
248
+ | Alias shape | Lands you as | Use cases |
249
+ | ------------------ | ---------------------- | ------------------------------------------------- |
250
+ | `awvm--<vm>` | The VM's admin user | `ssh awvm--myvm`, `scp file awvm--myvm:~/` |
251
+ | `awagent--<agent>` | The agent's Linux user | `ssh awagent--claude`, VS Code Remote-SSH targets |
252
+
253
+ The agent alias is keyed on the agent's operator-facing name (the same name you use in
254
+ `agw agent ...` commands), not on the on-VM Linux user (which is an implementation detail). The
255
+ prefixes are configurable via `operator.ssh_host_prefix` (default `awvm--`) and
256
+ `operator.ssh_agent_host_prefix` (default `awagent--`).
257
+
258
+ Entries are rebuilt declaratively from the database on every agent / VM lifecycle operation, so a
259
+ fresh `agw agent create` or `agw vm delete` keeps the file in sync without manual intervention. Run
260
+ `agw config sync-ssh-config` to force a rebuild.
261
+
184
262
  ### Sessions
185
263
 
186
264
  Manage sessions (persistent tmux sessions running in workspaces). Session names are globally unique
@@ -296,8 +374,8 @@ with sessions, at different scopes:
296
374
  | Method | Scope | tmux session name | Entry point |
297
375
  | ------------------------- | -------------------------------- | ------------------------ | --------------------------- |
298
376
  | `session attach` | One session | `<session-name>` | Operator's machine |
299
- | `workspace console` | One workspace | `ws-<workspace>-console` | On-VM or operator's machine |
300
377
  | `console` | Curated subset across workspaces | `aw-console-<name>` | Operator's machine |
378
+ | `workspace console` | One workspace | `ws-<workspace>-console` | On-VM or operator's machine |
301
379
  | `vm console` (deprecated) | All sessions on the VM | `vm-console` | Operator's machine |
302
380
 
303
381
  #### Session tmux sessions
@@ -310,21 +388,6 @@ creation, session management, and the command prompt are selectively unbound.
310
388
  Agent-mode sessions run on a per-agent tmux socket so the agent's shell connects directly to the
311
389
  tmux pane PTY. The socket path is persisted in the database.
312
390
 
313
- #### Workspace console
314
-
315
- `workspace console` uses tmuxinator to create or attach to a `ws-<name>-console` session. The
316
- tmuxinator config (`.tmuxinator.yml` in the workspace root) is regenerated whenever sessions change,
317
- so the console always reflects the current set of sessions. Best for in-VM work scoped to a single
318
- workspace (e.g. inside VS Code's integrated terminal). For curated views that span workspaces, use a
319
- named console (`console attach <name>`).
320
-
321
- ```text
322
- ws-myproject-console (tmuxinator, full tmux)
323
- Window 1: admin-shell login shell for the admin user
324
- Window 2: myproject-claude attached to session
325
- Window 3: myproject-debug attached to session
326
- ```
327
-
328
391
  #### Named console
329
392
 
330
393
  `console attach <name>` creates or attaches to the `aw-console-<name>` tmux session. Membership and
@@ -347,6 +410,21 @@ the DB is touched and changes appear on next attach. The mutation commands (`add
347
410
  attach/repair commands (`attach`, `restore-session`) do start a stopped VM, since their job is to
348
411
  bring live state up.
349
412
 
413
+ #### Workspace console
414
+
415
+ `workspace console` uses tmuxinator to create or attach to a `ws-<name>-console` session. The
416
+ tmuxinator config (`.tmuxinator.yml` in the workspace root) is regenerated whenever sessions change,
417
+ so the console always reflects the current set of sessions. Best for in-VM work scoped to a single
418
+ workspace (e.g. inside VS Code's integrated terminal). For curated views that span workspaces, use a
419
+ named console (`console attach <name>`).
420
+
421
+ ```text
422
+ ws-myproject-console (tmuxinator, full tmux)
423
+ Window 1: admin-shell login shell for the admin user
424
+ Window 2: myproject-claude attached to session
425
+ Window 3: myproject-debug attached to session
426
+ ```
427
+
350
428
  #### VM console (deprecated)
351
429
 
352
430
  `vm console` creates or attaches to the `vm-console` session, which spans all sessions on the VM.
@@ -386,9 +464,9 @@ description = "Claude Code interactive session"
386
464
  ```
387
465
 
388
466
  Template commands support `{{session_name}}` and `{{workspace_name}}` variable substitution
389
- (double-brace syntax, consistent with nerftools manifests). The optional `restart_command` is used
390
- by `session restart` -- useful for tools like Claude Code where `--resume` picks up the previous
391
- conversation. If omitted, the regular `command` is used.
467
+ (double-brace syntax). The optional `restart_command` is used by `session restart` -- useful for
468
+ tools like Claude Code where `--resume` picks up the previous conversation. If omitted, the regular
469
+ `command` is used.
392
470
 
393
471
  ### Catalog
394
472
 
@@ -409,7 +487,7 @@ Browse and inspect the built-in catalog of installable tools.
409
487
  | `agw config init` | Create a sample config file |
410
488
  | `agw config edit` | Open config in `$EDITOR` |
411
489
  | `agw config sample` | Print the sample config to stdout |
412
- | `agw config sync-ssh-config` | Rebuild SSH config entries for all VMs |
490
+ | `agw config sync-ssh-config` | Rebuild SSH config entries for VMs + agents |
413
491
  | `agw config sync-vscode-workspaces` | Regenerate .code-workspace files for all VMs |
414
492
 
415
493
  ## Configuration
@@ -429,8 +507,11 @@ Key sections:
429
507
  - `[session.config]` -- session defaults (history limit)
430
508
  - `[session_templates.*]` -- session templates with variable substitution
431
509
  - `[workspace_templates.*]` -- workspace templates with inheritance
432
- - `[named_console]` -- named-console layout (tmux preset name)
510
+ - `[named_console]` -- named-console layout (tmux preset names + `aw-session-vertical`)
433
511
  - `[git_credentials.*]` -- git credential providers (GitHub, Azure DevOps)
512
+ - `[<scope>.env]` -- env vars at vm / workspace / admin / agent / session scope
513
+ - `[secrets.*]` -- secret declarations referenced by `{ secret = "name" }` env entries
514
+ - `[secret_backends.*]` / `[secret_config]` -- active secret backend chain
434
515
  - `[apt_sources.*]` -- user-defined third-party apt repositories
435
516
  - `[apt_packages.*]` -- user-defined named apt package sets
436
517
  - `[system_install_commands.*]` -- user-defined system-level install commands
@@ -438,41 +519,103 @@ Key sections:
438
519
  - `[azure]` -- Azure-specific settings
439
520
  - `[proxmox]` -- Proxmox VE API settings
440
521
 
441
- ### Mise (Polyglot Tool Manager)
442
-
443
- Agentworks installs [mise](https://mise.jdx.dev/) by default on all VMs for managing CLI tools
444
- (terraform, adr-tools, node, etc.) with optional lockfile-based integrity verification. See
445
- [Using mise](../docs/guides/mise.md) for the full guide.
522
+ ### Environment Variables and Secrets
446
523
 
447
- ### Nerf Tools (Claude Code Plugin)
524
+ Env tables can be declared at five scopes; for any given session the merged value is computed in
525
+ this precedence order (highest scope wins; identity vars win over everything):
448
526
 
449
- Agentworks can build and deploy a Claude Code plugin containing "nerf tools" -- scoped,
450
- safety-constrained wrappers for CLI operations like git, az, and other tools. Nerf tools enforce
451
- guardrails (validated parameters, restricted flags, pre-flight checks) so AI agents operate safely.
527
+ ```text
528
+ session > (agent | admin) > workspace > vm (AGENTWORKS_* identity overrides all)
529
+ ```
452
530
 
453
- Enable in your VM template:
531
+ Admin and agent scopes are mutually exclusive: a shell opened as the admin user (e.g.
532
+ `agw vm shell`) sees admin scope; an agent-mode session sees agent scope. Each scope is a TOML table
533
+ mapping env-var name to either a plaintext string or `{ secret = "<name>" }`:
454
534
 
455
535
  ```toml
456
- [vm_templates.default]
457
- nerf_build_claude_plugin = true
536
+ [vm_templates.default.env]
537
+ HTTP_PROXY = "http://proxy:3128"
538
+ NPM_TOKEN = { secret = "npm-token" }
539
+
540
+ [admin.env]
541
+ EDITOR = "nvim"
458
542
  ```
459
543
 
460
- This builds the plugin to `nerf_home_dir/claude-plugin/` during VM init. To auto-install the plugin
461
- for users, add to admin or agent config:
544
+ Every `{ secret = "<name>" }` reference must point to a `[secrets.<name>]` declaration. Active
545
+ backends (and their precedence order) are listed in `[secret_config].backends`. Today the
546
+ implemented backends are:
547
+
548
+ - `env-var` -- reads from the operator's process env. Default convention is
549
+ `AW_SECRET_<UPPER_SNAKE_CASE>`, overridable per secret via
550
+ `[secrets.<name>].backend_mappings.env-var = "CUSTOM_NAME"`.
551
+ - `prompt` -- interactive prompt; batched at the start of the CLI run.
552
+
553
+ **Eager prompting (FRD R4):** every command that opens new shells resolves all needed secrets up
554
+ front, before any state mutation. The set of secrets is computed from the command's static filters
555
+ (positional targets, `--vm`, `--workspace`, `--agent`, etc.) -- dynamic predicates like
556
+ `--all-stopped` apply later, so the prompted set may over-approximate. Non-interactive mode (no TTY
557
+ or `--non-interactive`) surfaces missing secrets as `SecretUnavailableError` with a per-secret hint
558
+ naming which backends were tried. Commands that join existing shells (`session attach`,
559
+ `session list`, `console attach` against a live tmux session, `console add-sessions`) consume no
560
+ secrets per FRD R4 / R5.
561
+
562
+ **Miss semantics:** what "not found" means depends on the backend. Conventional sources (`env-var`,
563
+ `prompt`) treat a missing value as a soft miss and fall through to the next backend in the chain --
564
+ a `GITHUB_TOKEN` env var that isn't set is just-not-set, not a config error. Persistent-store
565
+ backends (1Password, Vault when implemented) will treat an explicit mapping that doesn't resolve as
566
+ a hard miss: they raise `SecretMappingError` and the chain halts so a wrong `op://` URI doesn't
567
+ quietly fall through to a prompt that masks the real problem.
568
+
569
+ Inspect the merged result for any context with `agw env show`:
462
570
 
463
- ```toml
464
- [admin.config]
465
- nerf_install_claude_plugin = true
571
+ ```bash
572
+ agw env show --session my-session # secrets redacted as <from secret: name>
573
+ agw env show --vm my-vm --reveal-secrets # resolves through the active backend chain
466
574
  ```
467
575
 
468
- The plugin provides skills that document available tools, and operator commands for managing
469
- permissions (`/nerftools:nerfctl-grant-allow`, `/nerftools:nerfctl-grant-deny`, etc.). Custom tool
470
- manifests can be added via `nerf_addl_manifests`.
576
+ Inspect how each active backend would resolve each declared secret (e.g. "which env var name does
577
+ this secret read from?") with `agw secret list`:
471
578
 
472
- Plugin identity (name, marketplace metadata) is defined in agentworks' own `nerf-config.yaml` and
473
- loaded via the nerftools config API. The version is a date-based build stamp that changes on each
474
- reinit. The build always emits an embedded marketplace so the plugin directory is installable
475
- standalone via `claude plugin marketplace add`.
579
+ ```bash
580
+ agw secret list
581
+ # NAME env-var prompt
582
+ # ---- ------- ------
583
+ # github-token AW_SECRET_GITHUB_TOKEN enabled
584
+ # force-prompt disabled enabled
585
+ # api-key OPENAI_API_KEY enabled
586
+ ```
587
+
588
+ Columns are the active backends in `[secret_config].backends` precedence order. Cells show each
589
+ backend's static lookup identifier (env var name, vault path, `op://` URI) or `disabled` / `enabled`
590
+ for backends with an explicit opt-out or no static identifier (prompt). Values are never resolved.
591
+
592
+ `agw doctor`'s Secrets group leads with one row naming the active backend chain
593
+ (`Configured backends: env-var, prompt`). Then one row per declared secret showing whether the chain
594
+ would resolve it (`would resolve via env-var`, `would resolve via prompt`, or
595
+ `not available in any backend`). Per-secret config-validity findings round out the group: unused
596
+ secret declarations and `backend_mappings.<kind>` entries pointing at undeclared or inactive
597
+ backends. `AGENTWORKS_*` identity overrides surface in the Configuration group (they're a
598
+ config-load warning). Broken `{ secret = "..." }` references are caught earlier as a hard
599
+ config-load error before doctor runs.
600
+
601
+ ### Mise (Polyglot Tool Manager)
602
+
603
+ Agentworks installs [mise](https://mise.jdx.dev/) by default on all VMs for managing CLI tools
604
+ (terraform, adr-tools, node, etc.) with optional lockfile-based integrity verification. See
605
+ [Using mise](../docs/guides/mise.md) for the full guide.
606
+
607
+ ### Claude Code Plugins
608
+
609
+ Agentworks can register Claude Code marketplaces and install plugins automatically per user (admin
610
+ and per-agent). Configure via `claude_marketplaces` and `claude_plugins` in `admin.config` or any
611
+ `agent_templates.*`. Requires the `claude` CLI on PATH (typically installed via
612
+ `user_install_commands`). To install nerftools this way:
613
+
614
+ ```toml
615
+ [admin.config]
616
+ claude_marketplaces = ["https://github.com/WayfarerLabs/nerftools#4.1.0"]
617
+ claude_plugins = ["nerftools-default@nerftools"]
618
+ ```
476
619
 
477
620
  ### Built-in Catalog
478
621
 
@@ -528,7 +671,10 @@ forward-only and run automatically.
528
671
 
529
672
  ## Environment Variables
530
673
 
531
- | Variable | Description |
532
- | ----------------------------- | ----------------------------------------------- |
533
- | `TAILSCALE_AUTH_KEY` | Tailscale auth key (skips prompt) |
534
- | `GIT_CREDENTIALS_<CRED_NAME>` | Git credential for `<CRED_NAME>` (skips prompt) |
674
+ | Variable | Description |
675
+ | -------------------------------- | ----------------------------------------------------------------------------------------- |
676
+ | `AW_TAILSCALE_AUTH_KEY` | Tailscale auth key (skips prompt). Legacy `TAILSCALE_AUTH_KEY` still read; warns once. |
677
+ | `AW_GIT_CREDENTIALS_<CRED_NAME>` | Git credential for `<CRED_NAME>`. Legacy `GIT_CREDENTIALS_<CRED_NAME>` still read; warns. |
678
+
679
+ Legacy env-var names continue to work with a one-time deprecation warning per process per name, and
680
+ will be removed in a future release.