agentworks-cli 0.6.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 (170) hide show
  1. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/CHANGELOG.md +84 -0
  2. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/PKG-INFO +205 -67
  3. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/README.md +204 -65
  4. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/agents/manager.py +616 -288
  5. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/agents/templates.py +5 -9
  6. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_app.py +10 -11
  7. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_errors.py +8 -2
  8. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/__init__.py +2 -0
  9. {agentworks_cli-0.6.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.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/vm.py +18 -2
  13. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/spec.py +6 -0
  14. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/config.py +396 -36
  15. {agentworks_cli-0.6.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.6.0 → agentworks_cli-0.7.0}/agentworks/errors.py +32 -0
  24. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/base.py +15 -7
  25. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/output.py +30 -0
  26. {agentworks_cli-0.6.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.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/console.py +8 -5
  36. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/manager.py +568 -129
  37. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/multi_console.py +462 -21
  38. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/multi_console_layout.py +8 -8
  39. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/templates.py +4 -3
  40. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/tmux.py +232 -98
  41. {agentworks_cli-0.6.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.6.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.6.0 → agentworks_cli-0.7.0}/agentworks/vms/backup.py +27 -21
  52. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/base.py +47 -7
  53. agentworks_cli-0.7.0/agentworks/vms/hardening.py +251 -0
  54. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/initializer.py +567 -227
  55. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/manager.py +248 -131
  56. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/azure.py +60 -35
  57. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/lima.py +15 -11
  58. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/proxmox.py +10 -9
  59. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/wsl2.py +8 -5
  60. agentworks_cli-0.7.0/agentworks/vms/tailscale_dns.py +271 -0
  61. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/templates.py +6 -24
  62. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/backends/vm.py +7 -11
  63. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/manager.py +22 -18
  64. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/templates.py +6 -1
  65. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/pyproject.toml +1 -2
  66. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/conftest.py +57 -9
  67. agentworks_cli-0.7.0/tests/test_agents.py +176 -0
  68. agentworks_cli-0.7.0/tests/test_authorized_keys.py +234 -0
  69. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_completions.py +2 -0
  70. agentworks_cli-0.7.0/tests/test_config_env_and_secrets.py +545 -0
  71. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_consoles.py +78 -8
  72. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_consoles_layout.py +7 -2
  73. agentworks_cli-0.7.0/tests/test_doctor_env_and_secrets.py +351 -0
  74. agentworks_cli-0.7.0/tests/test_env_compat.py +125 -0
  75. agentworks_cli-0.7.0/tests/test_env_compose.py +97 -0
  76. agentworks_cli-0.7.0/tests/test_env_entry.py +36 -0
  77. agentworks_cli-0.7.0/tests/test_env_identity.py +134 -0
  78. agentworks_cli-0.7.0/tests/test_env_merge.py +99 -0
  79. agentworks_cli-0.7.0/tests/test_env_show.py +307 -0
  80. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_error_wrapper.py +18 -31
  81. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_initializer.py +391 -0
  82. agentworks_cli-0.7.0/tests/test_initializer_env_fragments.py +435 -0
  83. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_remote_exec.py +1 -1
  84. agentworks_cli-0.7.0/tests/test_sample_config.py +97 -0
  85. agentworks_cli-0.7.0/tests/test_secrets_base.py +114 -0
  86. agentworks_cli-0.7.0/tests/test_secrets_eager_resolve.py +1382 -0
  87. agentworks_cli-0.7.0/tests/test_secrets_env_var.py +145 -0
  88. agentworks_cli-0.7.0/tests/test_secrets_inspect.py +193 -0
  89. agentworks_cli-0.7.0/tests/test_secrets_orchestration.py +435 -0
  90. agentworks_cli-0.7.0/tests/test_secrets_prompt.py +120 -0
  91. agentworks_cli-0.7.0/tests/test_secrets_resolver.py +361 -0
  92. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_session_liveness.py +47 -6
  93. agentworks_cli-0.7.0/tests/test_session_transport.py +346 -0
  94. agentworks_cli-0.7.0/tests/test_sessions_tmux_create.py +268 -0
  95. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_ssh_config.py +132 -0
  96. agentworks_cli-0.7.0/tests/test_ssh_logger.py +72 -0
  97. agentworks_cli-0.7.0/tests/test_ssh_set_env.py +192 -0
  98. agentworks_cli-0.7.0/tests/test_tailscale_dns.py +446 -0
  99. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_tmuxinator.py +1 -1
  100. agentworks_cli-0.7.0/tests/test_vm_shell_provisioner.py +615 -0
  101. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_wsl2_keepalive.py +4 -4
  102. agentworks_cli-0.7.0/tests/transports/__init__.py +0 -0
  103. agentworks_cli-0.7.0/tests/transports/conftest.py +30 -0
  104. agentworks_cli-0.7.0/tests/transports/test_abc.py +88 -0
  105. agentworks_cli-0.7.0/tests/transports/test_factories.py +409 -0
  106. agentworks_cli-0.7.0/tests/transports/test_lima.py +136 -0
  107. agentworks_cli-0.7.0/tests/transports/test_remote_lima.py +168 -0
  108. agentworks_cli-0.7.0/tests/transports/test_ssh.py +262 -0
  109. agentworks_cli-0.7.0/tests/transports/test_wsl2.py +164 -0
  110. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/uv.lock +3 -64
  111. agentworks_cli-0.6.0/agentworks/nerf-config.yaml +0 -16
  112. agentworks_cli-0.6.0/agentworks/sample-config.toml +0 -319
  113. agentworks_cli-0.6.0/agentworks/ssh.py +0 -769
  114. agentworks_cli-0.6.0/tests/test_agents.py +0 -67
  115. agentworks_cli-0.6.0/tests/test_authorized_keys.py +0 -106
  116. agentworks_cli-0.6.0/tests/test_exec_target.py +0 -151
  117. agentworks_cli-0.6.0/tests/test_nerf_plugin.py +0 -196
  118. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/.gitignore +0 -0
  119. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/.python-version +0 -0
  120. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/__init__.py +0 -0
  121. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/agents/__init__.py +0 -0
  122. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/catalog.py +0 -0
  123. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/catalog.toml +0 -0
  124. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/__init__.py +0 -0
  125. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_entry.py +0 -0
  126. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_helpers.py +0 -0
  127. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_typer_output.py +0 -0
  128. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/agent.py +0 -0
  129. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/catalog.py +0 -0
  130. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/completion.py +0 -0
  131. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/config.py +0 -0
  132. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/console.py +0 -0
  133. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/session.py +0 -0
  134. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/vm_host.py +0 -0
  135. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/workspace.py +0 -0
  136. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/__init__.py +0 -0
  137. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/bash.py +0 -0
  138. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/install.py +0 -0
  139. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/powershell.py +0 -0
  140. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/zsh.py +0 -0
  141. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/db.py +0 -0
  142. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/__init__.py +0 -0
  143. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/azdo.py +0 -0
  144. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/github.py +0 -0
  145. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/__init__.py +0 -0
  146. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vm_hosts/__init__.py +0 -0
  147. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vm_hosts/manager.py +0 -0
  148. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/__init__.py +0 -0
  149. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/bootstrap_script.py +0 -0
  150. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/cloud_init.py +0 -0
  151. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/__init__.py +0 -0
  152. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/proxmox_api.py +0 -0
  153. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/__init__.py +0 -0
  154. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/backends/__init__.py +0 -0
  155. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/tmuxinator.py +0 -0
  156. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/pypi-dist/.gitignore +0 -0
  157. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/__init__.py +0 -0
  158. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_bootstrap_script.py +0 -0
  159. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_catalog.py +0 -0
  160. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_cli_helpers.py +0 -0
  161. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_cloud_init.py +0 -0
  162. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_config.py +0 -0
  163. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_consoles_restore.py +0 -0
  164. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_db.py +0 -0
  165. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_doctor.py +0 -0
  166. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_name_validation.py +0 -0
  167. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_proxmox_api.py +0 -0
  168. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_templates.py +0 -0
  169. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_vm_hosts.py +0 -0
  170. {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_wsl2_paths.py +0 -0
@@ -1,5 +1,89 @@
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
+
3
87
  ## [0.6.0](https://github.com/WayfarerLabs/agentworks/compare/v0.5.0...v0.6.0) (2026-06-06)
4
88
 
5
89
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentworks-cli
3
- Version: 0.6.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
 
@@ -137,6 +165,18 @@ Changes to config (new packages, different install commands, etc.) are picked up
137
165
  `vm delete` requires `--force` if the VM has workspaces, agents, or sessions. The confirmation
138
166
  message shows what will be deleted. Pass `--yes` to skip the prompt.
139
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
+
140
180
  ### Workspaces
141
181
 
142
182
  Manage workspaces on VMs.
@@ -170,25 +210,55 @@ during deletion. Pass `--yes` to skip the confirmation prompt.
170
210
 
171
211
  Manage agents (isolated Linux users) on VMs. Agents are VM-scoped and access workspaces via grants.
172
212
 
173
- | Command | Description |
174
- | -------------------------------------------- | ------------------------------ |
175
- | `agw agent create <name> [--vm]` | Create an agent on a VM |
176
- | `agw agent list [--vm <vm>]` | List agents |
177
- | `agw agent describe <name>` | Show agent details and grants |
178
- | `agw agent reinit <name>` | Re-run agent setup |
179
- | `agw agent grant-workspaces <name> <ws>...` | Grant workspace access |
180
- | `agw agent grant-workspaces <name> --all` | Grant access to all workspaces |
181
- | `agw agent revoke-workspaces <name> <ws>...` | Revoke workspace access |
182
- | `agw agent revoke-workspaces <name> --all` | Revoke all explicit grants |
183
- | `agw agent shell <name> [--workspace <ws>]` | Shell into an agent |
184
- | `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 |
185
226
 
186
227
  `agent create <name>` takes the agent name as a required positional. Optional flags: `--vm`,
187
228
  `--template`, and `--grant-all-workspaces`.
188
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
+
189
236
  `agent delete` requires `--force` if the agent has running sessions. Pass `--yes` to skip the
190
237
  confirmation prompt.
191
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
+
192
262
  ### Sessions
193
263
 
194
264
  Manage sessions (persistent tmux sessions running in workspaces). Session names are globally unique
@@ -304,8 +374,8 @@ with sessions, at different scopes:
304
374
  | Method | Scope | tmux session name | Entry point |
305
375
  | ------------------------- | -------------------------------- | ------------------------ | --------------------------- |
306
376
  | `session attach` | One session | `<session-name>` | Operator's machine |
307
- | `workspace console` | One workspace | `ws-<workspace>-console` | On-VM or operator's machine |
308
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 |
309
379
  | `vm console` (deprecated) | All sessions on the VM | `vm-console` | Operator's machine |
310
380
 
311
381
  #### Session tmux sessions
@@ -318,21 +388,6 @@ creation, session management, and the command prompt are selectively unbound.
318
388
  Agent-mode sessions run on a per-agent tmux socket so the agent's shell connects directly to the
319
389
  tmux pane PTY. The socket path is persisted in the database.
320
390
 
321
- #### Workspace console
322
-
323
- `workspace console` uses tmuxinator to create or attach to a `ws-<name>-console` session. The
324
- tmuxinator config (`.tmuxinator.yml` in the workspace root) is regenerated whenever sessions change,
325
- so the console always reflects the current set of sessions. Best for in-VM work scoped to a single
326
- workspace (e.g. inside VS Code's integrated terminal). For curated views that span workspaces, use a
327
- named console (`console attach <name>`).
328
-
329
- ```text
330
- ws-myproject-console (tmuxinator, full tmux)
331
- Window 1: admin-shell login shell for the admin user
332
- Window 2: myproject-claude attached to session
333
- Window 3: myproject-debug attached to session
334
- ```
335
-
336
391
  #### Named console
337
392
 
338
393
  `console attach <name>` creates or attaches to the `aw-console-<name>` tmux session. Membership and
@@ -355,6 +410,21 @@ the DB is touched and changes appear on next attach. The mutation commands (`add
355
410
  attach/repair commands (`attach`, `restore-session`) do start a stopped VM, since their job is to
356
411
  bring live state up.
357
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
+
358
428
  #### VM console (deprecated)
359
429
 
360
430
  `vm console` creates or attaches to the `vm-console` session, which spans all sessions on the VM.
@@ -394,9 +464,9 @@ description = "Claude Code interactive session"
394
464
  ```
395
465
 
396
466
  Template commands support `{{session_name}}` and `{{workspace_name}}` variable substitution
397
- (double-brace syntax, consistent with nerftools manifests). The optional `restart_command` is used
398
- by `session restart` -- useful for tools like Claude Code where `--resume` picks up the previous
399
- 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.
400
470
 
401
471
  ### Catalog
402
472
 
@@ -417,7 +487,7 @@ Browse and inspect the built-in catalog of installable tools.
417
487
  | `agw config init` | Create a sample config file |
418
488
  | `agw config edit` | Open config in `$EDITOR` |
419
489
  | `agw config sample` | Print the sample config to stdout |
420
- | `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 |
421
491
  | `agw config sync-vscode-workspaces` | Regenerate .code-workspace files for all VMs |
422
492
 
423
493
  ## Configuration
@@ -439,6 +509,9 @@ Key sections:
439
509
  - `[workspace_templates.*]` -- workspace templates with inheritance
440
510
  - `[named_console]` -- named-console layout (tmux preset names + `aw-session-vertical`)
441
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
442
515
  - `[apt_sources.*]` -- user-defined third-party apt repositories
443
516
  - `[apt_packages.*]` -- user-defined named apt package sets
444
517
  - `[system_install_commands.*]` -- user-defined system-level install commands
@@ -446,41 +519,103 @@ Key sections:
446
519
  - `[azure]` -- Azure-specific settings
447
520
  - `[proxmox]` -- Proxmox VE API settings
448
521
 
449
- ### Mise (Polyglot Tool Manager)
522
+ ### Environment Variables and Secrets
450
523
 
451
- Agentworks installs [mise](https://mise.jdx.dev/) by default on all VMs for managing CLI tools
452
- (terraform, adr-tools, node, etc.) with optional lockfile-based integrity verification. See
453
- [Using mise](../docs/guides/mise.md) for the full guide.
454
-
455
- ### 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):
456
526
 
457
- Agentworks can build and deploy a Claude Code plugin containing "nerf tools" -- scoped,
458
- safety-constrained wrappers for CLI operations like git, az, and other tools. Nerf tools enforce
459
- 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
+ ```
460
530
 
461
- 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>" }`:
462
534
 
463
535
  ```toml
464
- [vm_templates.default]
465
- 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"
466
542
  ```
467
543
 
468
- This builds the plugin to `nerf_home_dir/claude-plugin/` during VM init. To auto-install the plugin
469
- 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`:
470
570
 
471
- ```toml
472
- [admin.config]
473
- 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
474
574
  ```
475
575
 
476
- The plugin provides skills that document available tools, and operator commands for managing
477
- permissions (`/nerftools:nerfctl-grant-allow`, `/nerftools:nerfctl-grant-deny`, etc.). Custom tool
478
- 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`:
479
578
 
480
- Plugin identity (name, marketplace metadata) is defined in agentworks' own `nerf-config.yaml` and
481
- loaded via the nerftools config API. The version is a date-based build stamp that changes on each
482
- reinit. The build always emits an embedded marketplace so the plugin directory is installable
483
- 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
+ ```
484
619
 
485
620
  ### Built-in Catalog
486
621
 
@@ -536,7 +671,10 @@ forward-only and run automatically.
536
671
 
537
672
  ## Environment Variables
538
673
 
539
- | Variable | Description |
540
- | ----------------------------- | ----------------------------------------------- |
541
- | `TAILSCALE_AUTH_KEY` | Tailscale auth key (skips prompt) |
542
- | `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.