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.
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/CHANGELOG.md +84 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/PKG-INFO +205 -67
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/README.md +204 -65
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/agents/manager.py +616 -288
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/agents/templates.py +5 -9
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_app.py +10 -11
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_errors.py +8 -2
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/__init__.py +2 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/doctor.py +2 -0
- agentworks_cli-0.7.0/agentworks/cli/commands/env.py +79 -0
- agentworks_cli-0.7.0/agentworks/cli/commands/secret.py +30 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/vm.py +18 -2
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/spec.py +6 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/config.py +396 -36
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/doctor.py +123 -12
- agentworks_cli-0.7.0/agentworks/env/__init__.py +34 -0
- agentworks_cli-0.7.0/agentworks/env/compose.py +63 -0
- agentworks_cli-0.7.0/agentworks/env/entry.py +32 -0
- agentworks_cli-0.7.0/agentworks/env/identity.py +129 -0
- agentworks_cli-0.7.0/agentworks/env/merge.py +49 -0
- agentworks_cli-0.7.0/agentworks/env/show.py +425 -0
- agentworks_cli-0.7.0/agentworks/env_compat.py +53 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/errors.py +32 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/base.py +15 -7
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/output.py +30 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/remote_exec.py +7 -7
- agentworks_cli-0.7.0/agentworks/sample-config.toml +396 -0
- agentworks_cli-0.7.0/agentworks/secrets/__init__.py +35 -0
- agentworks_cli-0.7.0/agentworks/secrets/base.py +197 -0
- agentworks_cli-0.7.0/agentworks/secrets/env_var.py +65 -0
- agentworks_cli-0.7.0/agentworks/secrets/inspect.py +142 -0
- agentworks_cli-0.7.0/agentworks/secrets/orchestration.py +172 -0
- agentworks_cli-0.7.0/agentworks/secrets/prompt.py +60 -0
- agentworks_cli-0.7.0/agentworks/secrets/resolver.py +214 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/console.py +8 -5
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/manager.py +568 -129
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/multi_console.py +462 -21
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/multi_console_layout.py +8 -8
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/templates.py +4 -3
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/tmux.py +232 -98
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sources.py +8 -7
- agentworks_cli-0.7.0/agentworks/ssh.py +360 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/ssh_config.py +49 -6
- agentworks_cli-0.7.0/agentworks/transports/__init__.py +255 -0
- agentworks_cli-0.7.0/agentworks/transports/_shared.py +24 -0
- agentworks_cli-0.7.0/agentworks/transports/base.py +219 -0
- agentworks_cli-0.7.0/agentworks/transports/lima.py +161 -0
- agentworks_cli-0.7.0/agentworks/transports/remote_lima.py +165 -0
- agentworks_cli-0.7.0/agentworks/transports/ssh.py +293 -0
- agentworks_cli-0.7.0/agentworks/transports/wsl2.py +177 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/backup.py +27 -21
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/base.py +47 -7
- agentworks_cli-0.7.0/agentworks/vms/hardening.py +251 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/initializer.py +567 -227
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/manager.py +248 -131
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/azure.py +60 -35
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/lima.py +15 -11
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/proxmox.py +10 -9
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/wsl2.py +8 -5
- agentworks_cli-0.7.0/agentworks/vms/tailscale_dns.py +271 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/templates.py +6 -24
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/backends/vm.py +7 -11
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/manager.py +22 -18
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/templates.py +6 -1
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/pyproject.toml +1 -2
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/conftest.py +57 -9
- agentworks_cli-0.7.0/tests/test_agents.py +176 -0
- agentworks_cli-0.7.0/tests/test_authorized_keys.py +234 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_completions.py +2 -0
- agentworks_cli-0.7.0/tests/test_config_env_and_secrets.py +545 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_consoles.py +78 -8
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_consoles_layout.py +7 -2
- agentworks_cli-0.7.0/tests/test_doctor_env_and_secrets.py +351 -0
- agentworks_cli-0.7.0/tests/test_env_compat.py +125 -0
- agentworks_cli-0.7.0/tests/test_env_compose.py +97 -0
- agentworks_cli-0.7.0/tests/test_env_entry.py +36 -0
- agentworks_cli-0.7.0/tests/test_env_identity.py +134 -0
- agentworks_cli-0.7.0/tests/test_env_merge.py +99 -0
- agentworks_cli-0.7.0/tests/test_env_show.py +307 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_error_wrapper.py +18 -31
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_initializer.py +391 -0
- agentworks_cli-0.7.0/tests/test_initializer_env_fragments.py +435 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_remote_exec.py +1 -1
- agentworks_cli-0.7.0/tests/test_sample_config.py +97 -0
- agentworks_cli-0.7.0/tests/test_secrets_base.py +114 -0
- agentworks_cli-0.7.0/tests/test_secrets_eager_resolve.py +1382 -0
- agentworks_cli-0.7.0/tests/test_secrets_env_var.py +145 -0
- agentworks_cli-0.7.0/tests/test_secrets_inspect.py +193 -0
- agentworks_cli-0.7.0/tests/test_secrets_orchestration.py +435 -0
- agentworks_cli-0.7.0/tests/test_secrets_prompt.py +120 -0
- agentworks_cli-0.7.0/tests/test_secrets_resolver.py +361 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_session_liveness.py +47 -6
- agentworks_cli-0.7.0/tests/test_session_transport.py +346 -0
- agentworks_cli-0.7.0/tests/test_sessions_tmux_create.py +268 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_ssh_config.py +132 -0
- agentworks_cli-0.7.0/tests/test_ssh_logger.py +72 -0
- agentworks_cli-0.7.0/tests/test_ssh_set_env.py +192 -0
- agentworks_cli-0.7.0/tests/test_tailscale_dns.py +446 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_tmuxinator.py +1 -1
- agentworks_cli-0.7.0/tests/test_vm_shell_provisioner.py +615 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_wsl2_keepalive.py +4 -4
- agentworks_cli-0.7.0/tests/transports/__init__.py +0 -0
- agentworks_cli-0.7.0/tests/transports/conftest.py +30 -0
- agentworks_cli-0.7.0/tests/transports/test_abc.py +88 -0
- agentworks_cli-0.7.0/tests/transports/test_factories.py +409 -0
- agentworks_cli-0.7.0/tests/transports/test_lima.py +136 -0
- agentworks_cli-0.7.0/tests/transports/test_remote_lima.py +168 -0
- agentworks_cli-0.7.0/tests/transports/test_ssh.py +262 -0
- agentworks_cli-0.7.0/tests/transports/test_wsl2.py +164 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/uv.lock +3 -64
- agentworks_cli-0.6.0/agentworks/nerf-config.yaml +0 -16
- agentworks_cli-0.6.0/agentworks/sample-config.toml +0 -319
- agentworks_cli-0.6.0/agentworks/ssh.py +0 -769
- agentworks_cli-0.6.0/tests/test_agents.py +0 -67
- agentworks_cli-0.6.0/tests/test_authorized_keys.py +0 -106
- agentworks_cli-0.6.0/tests/test_exec_target.py +0 -151
- agentworks_cli-0.6.0/tests/test_nerf_plugin.py +0 -196
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/.gitignore +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/.python-version +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/agents/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/catalog.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/catalog.toml +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_entry.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_helpers.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/_typer_output.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/agent.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/catalog.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/completion.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/config.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/console.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/session.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/vm_host.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/cli/commands/workspace.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/bash.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/install.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/powershell.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/completions/zsh.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/db.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/azdo.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/git_credentials/github.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/sessions/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vm_hosts/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vm_hosts/manager.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/bootstrap_script.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/cloud_init.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/vms/provisioners/proxmox_api.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/backends/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/agentworks/workspaces/tmuxinator.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/pypi-dist/.gitignore +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/__init__.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_bootstrap_script.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_catalog.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_cli_helpers.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_cloud_init.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_config.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_consoles_restore.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_db.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_doctor.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_name_validation.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_proxmox_api.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_templates.py +0 -0
- {agentworks_cli-0.6.0 → agentworks_cli-0.7.0}/tests/test_vm_hosts.py +0 -0
- {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.
|
|
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
|
-
|
|
41
|
-
agw
|
|
42
|
-
|
|
43
|
-
|
|
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`),
|
|
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>]` |
|
|
184
|
-
| `agw 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
|
|
398
|
-
|
|
399
|
-
|
|
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
|
|
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
|
-
###
|
|
522
|
+
### Environment Variables and Secrets
|
|
450
523
|
|
|
451
|
-
|
|
452
|
-
|
|
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
|
-
|
|
458
|
-
|
|
459
|
-
|
|
527
|
+
```text
|
|
528
|
+
session > (agent | admin) > workspace > vm (AGENTWORKS_* identity overrides all)
|
|
529
|
+
```
|
|
460
530
|
|
|
461
|
-
|
|
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
|
-
|
|
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
|
-
|
|
469
|
-
|
|
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
|
-
```
|
|
472
|
-
|
|
473
|
-
|
|
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
|
-
|
|
477
|
-
|
|
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
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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
|
|
540
|
-
|
|
|
541
|
-
| `
|
|
542
|
-
| `
|
|
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.
|