agentworks-cli 0.3.0__tar.gz → 0.5.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 (111) hide show
  1. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/CHANGELOG.md +68 -0
  2. agentworks_cli-0.5.0/PKG-INFO +534 -0
  3. agentworks_cli-0.5.0/README.md +517 -0
  4. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/agents/manager.py +146 -61
  5. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/catalog.py +3 -1
  6. agentworks_cli-0.5.0/agentworks/cli/__init__.py +32 -0
  7. agentworks_cli-0.5.0/agentworks/cli/_app.py +90 -0
  8. agentworks_cli-0.5.0/agentworks/cli/_entry.py +129 -0
  9. agentworks_cli-0.5.0/agentworks/cli/_errors.py +50 -0
  10. agentworks_cli-0.5.0/agentworks/cli/_helpers.py +103 -0
  11. agentworks_cli-0.5.0/agentworks/cli/_typer_output.py +93 -0
  12. agentworks_cli-0.5.0/agentworks/cli/commands/__init__.py +23 -0
  13. agentworks_cli-0.5.0/agentworks/cli/commands/agent.py +163 -0
  14. agentworks_cli-0.5.0/agentworks/cli/commands/catalog.py +171 -0
  15. agentworks_cli-0.5.0/agentworks/cli/commands/completion.py +67 -0
  16. agentworks_cli-0.5.0/agentworks/cli/commands/config.py +102 -0
  17. agentworks_cli-0.5.0/agentworks/cli/commands/console.py +273 -0
  18. agentworks_cli-0.5.0/agentworks/cli/commands/doctor.py +45 -0
  19. agentworks_cli-0.5.0/agentworks/cli/commands/session.py +339 -0
  20. agentworks_cli-0.5.0/agentworks/cli/commands/vm.py +254 -0
  21. agentworks_cli-0.5.0/agentworks/cli/commands/vm_host.py +48 -0
  22. agentworks_cli-0.5.0/agentworks/cli/commands/workspace.py +158 -0
  23. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/completions/bash.py +9 -9
  24. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/completions/install.py +15 -0
  25. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/completions/powershell.py +8 -8
  26. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/completions/spec.py +24 -15
  27. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/completions/zsh.py +9 -9
  28. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/config.py +79 -18
  29. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/db.py +207 -42
  30. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/doctor.py +4 -4
  31. agentworks_cli-0.5.0/agentworks/errors.py +117 -0
  32. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/output.py +36 -53
  33. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/sample-config.toml +25 -2
  34. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/sessions/console.py +15 -7
  35. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/sessions/manager.py +199 -67
  36. agentworks_cli-0.5.0/agentworks/sessions/multi_console.py +1607 -0
  37. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/sources.py +3 -1
  38. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/ssh.py +7 -5
  39. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vm_hosts/manager.py +30 -8
  40. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/backup.py +14 -5
  41. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/initializer.py +13 -4
  42. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/manager.py +130 -35
  43. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/provisioners/azure.py +2 -1
  44. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/provisioners/lima.py +12 -5
  45. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/provisioners/proxmox_api.py +3 -1
  46. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/workspaces/backends/vm.py +9 -4
  47. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/workspaces/manager.py +219 -61
  48. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/workspaces/tmuxinator.py +4 -1
  49. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/pyproject.toml +4 -1
  50. agentworks_cli-0.5.0/tests/test_agents.py +67 -0
  51. agentworks_cli-0.5.0/tests/test_cli_helpers.py +53 -0
  52. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_completions.py +93 -0
  53. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_config.py +48 -0
  54. agentworks_cli-0.5.0/tests/test_consoles.py +2383 -0
  55. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_db.py +108 -0
  56. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_name_validation.py +51 -2
  57. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_tmuxinator.py +3 -3
  58. agentworks_cli-0.5.0/tests/test_vm_hosts.py +83 -0
  59. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/uv.lock +1 -1
  60. agentworks_cli-0.3.0/PKG-INFO +0 -753
  61. agentworks_cli-0.3.0/README.md +0 -736
  62. agentworks_cli-0.3.0/agentworks/cli.py +0 -1815
  63. agentworks_cli-0.3.0/agentworks/sessions/multi_console.py +0 -874
  64. agentworks_cli-0.3.0/tests/test_agents.py +0 -30
  65. agentworks_cli-0.3.0/tests/test_consoles.py +0 -1260
  66. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/.gitignore +0 -0
  67. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/.python-version +0 -0
  68. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/__init__.py +0 -0
  69. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/agents/__init__.py +0 -0
  70. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/agents/templates.py +0 -0
  71. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/catalog.toml +0 -0
  72. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/completions/__init__.py +0 -0
  73. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/git_credentials/__init__.py +0 -0
  74. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/git_credentials/azdo.py +0 -0
  75. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/git_credentials/base.py +0 -0
  76. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/git_credentials/github.py +0 -0
  77. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/nerf-config.yaml +0 -0
  78. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/remote_exec.py +0 -0
  79. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/sessions/__init__.py +0 -0
  80. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/sessions/templates.py +0 -0
  81. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/sessions/tmux.py +0 -0
  82. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/ssh_config.py +0 -0
  83. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vm_hosts/__init__.py +0 -0
  84. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/__init__.py +0 -0
  85. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/base.py +0 -0
  86. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/bootstrap_script.py +0 -0
  87. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/cloud_init.py +0 -0
  88. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/provisioners/__init__.py +0 -0
  89. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/provisioners/proxmox.py +0 -0
  90. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/provisioners/wsl2.py +0 -0
  91. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/vms/templates.py +0 -0
  92. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/workspaces/__init__.py +0 -0
  93. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/workspaces/backends/__init__.py +0 -0
  94. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/agentworks/workspaces/templates.py +0 -0
  95. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/pypi-dist/.gitignore +0 -0
  96. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/__init__.py +0 -0
  97. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/conftest.py +0 -0
  98. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_authorized_keys.py +0 -0
  99. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_bootstrap_script.py +0 -0
  100. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_catalog.py +0 -0
  101. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_cloud_init.py +0 -0
  102. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_doctor.py +0 -0
  103. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_error_wrapper.py +0 -0
  104. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_exec_target.py +0 -0
  105. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_initializer.py +0 -0
  106. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_nerf_plugin.py +0 -0
  107. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_proxmox_api.py +0 -0
  108. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_remote_exec.py +0 -0
  109. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_session_liveness.py +0 -0
  110. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_ssh_config.py +0 -0
  111. {agentworks_cli-0.3.0 → agentworks_cli-0.5.0}/tests/test_templates.py +0 -0
@@ -1,5 +1,73 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.5.0](https://github.com/WayfarerLabs/agentworks/compare/v0.4.0...v0.5.0) (2026-06-05)
4
+
5
+
6
+ ### Features
7
+
8
+ * **cli:** add --admin filter to session list (mutex with --agent) ([ed8a48c](https://github.com/WayfarerLabs/agentworks/commit/ed8a48c1358700e65b218aedfb3cacb1cdae529e))
9
+ * **cli:** comma-separated multi-value filters on every list command ([b57a59b](https://github.com/WayfarerLabs/agentworks/commit/b57a59bbd5f3d0727bfc97428f5d36aa6563d6a1))
10
+ * **cli:** consistent filter flags on list commands + vm-host remove --yes ([a050eb0](https://github.com/WayfarerLabs/agentworks/commit/a050eb0281a118c48d25b08af980c3bd43e7297a))
11
+ * **cli:** consistent filter flags on list commands + vm-host remove --yes ([148a92b](https://github.com/WayfarerLabs/agentworks/commit/148a92b346b6b4e5c16d4128c1b4d96ad1977673))
12
+ * **console:** add reorder-sessions command + pluralize variadic verbs ([ebb5b0d](https://github.com/WayfarerLabs/agentworks/commit/ebb5b0d3c7abdf57c34270e657ca06c0dc557f49))
13
+ * **console:** add reorder-sessions command and pluralize variadic verbs ([ea677d2](https://github.com/WayfarerLabs/agentworks/commit/ea677d2d8a186ca991f34069f5c840a2cc8eabfc))
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * **cli:** address Copilot review feedback on PR [#90](https://github.com/WayfarerLabs/agentworks/issues/90) ([73c8305](https://github.com/WayfarerLabs/agentworks/commit/73c83058565102a4cae6fdf42ba80dfaa5a9b415))
19
+ * **completion:** drop _agw symlink so zsh autoloads completions for the agw alias ([71bc0db](https://github.com/WayfarerLabs/agentworks/commit/71bc0db25718ff475770c69e6116b3f363dd8aa0))
20
+ * **completion:** drop _agw symlink so zsh autoloads completions for the agw alias ([4d889fc](https://github.com/WayfarerLabs/agentworks/commit/4d889fcbb26f44219fedb93c4abce7cbb543c016))
21
+ * **console:** allow legacy 'ws--agent' session names when referenced in console specs ([74ce187](https://github.com/WayfarerLabs/agentworks/commit/74ce187d59e7604e3e34ce4c82bdace4921d246d))
22
+ * **console:** allow legacy 'ws--agent' session names when referenced in console specs ([62a9ab6](https://github.com/WayfarerLabs/agentworks/commit/62a9ab63287f664f10b6589f15c2a0093903be66))
23
+ * **console:** clean up tmux windows when member sessions are deleted ([9d31938](https://github.com/WayfarerLabs/agentworks/commit/9d31938dc0cafede4be2288e2193b61ea2431750))
24
+ * **console:** clean up tmux windows when member sessions are deleted ([482b482](https://github.com/WayfarerLabs/agentworks/commit/482b482dd303aad9d0a73e56e4e34d2e17ecc0bb))
25
+ * **console:** compact reorder when windows missing + bail on dup names ([73f74b0](https://github.com/WayfarerLabs/agentworks/commit/73f74b00e421fd7ed6d126eb8a4983a6866b8239))
26
+ * **console:** rename admin-shell window to --admin-- to prevent session collision ([4811b21](https://github.com/WayfarerLabs/agentworks/commit/4811b210215a6a563caf09df357b28c9b4a53d32))
27
+ * **console:** use leading-underscore placeholder so legacy '--' session names cannot collide ([6a18248](https://github.com/WayfarerLabs/agentworks/commit/6a18248822360a00d06cd8743d71f0c5aa223228))
28
+ * dont store unused host var ([f577bef](https://github.com/WayfarerLabs/agentworks/commit/f577bef5d0faf8960cb66465ebbbd1ea2cb1ac7a))
29
+ * improve comment for case when --force is set ([44f2597](https://github.com/WayfarerLabs/agentworks/commit/44f259734b829099b97b508c4431fa413f930fae))
30
+
31
+
32
+ ### Documentation
33
+
34
+ * address reviewer feedback on PR [#81](https://github.com/WayfarerLabs/agentworks/issues/81) ([c9a8219](https://github.com/WayfarerLabs/agentworks/commit/c9a8219a58e7c34404fec3bc51cf9c541faf07ee))
35
+ * **cli:** apply final review polish to README and docstrings ([eb7483e](https://github.com/WayfarerLabs/agentworks/commit/eb7483eba9828ab2021ebf14e69b43bba2897be7))
36
+ * **cli:** fix _helpers.py docstring to use the current function names ([2a5a0ad](https://github.com/WayfarerLabs/agentworks/commit/2a5a0ad2f8f09cda8b351c4df7c7f00a52db5ce9))
37
+ * embrace agw as the everyday command across all operator-facing output ([c7e8f5a](https://github.com/WayfarerLabs/agentworks/commit/c7e8f5ad0c5adfaf5590c333dd571dab7c9d7ca3))
38
+ * embrace agw as the everyday command across all operator-facing output ([ccc1844](https://github.com/WayfarerLabs/agentworks/commit/ccc1844d948385d610bd15e9241e1c475454a03c))
39
+ * split project framing to top-level README; add dependabot config ([35f8556](https://github.com/WayfarerLabs/agentworks/commit/35f8556f583415b65cd76803ca85e822016a4c68))
40
+ * split project framing to top-level README; add dependabot config ([9ea91a1](https://github.com/WayfarerLabs/agentworks/commit/9ea91a1a088b9bfd54273517b3edf78c5c72ade2))
41
+ * sweep three more operator-facing agentworks->agw misses ([6e1c008](https://github.com/WayfarerLabs/agentworks/commit/6e1c0085dd1b4ffea073f2df2adc10657952f761))
42
+
43
+ ## [0.4.0](https://github.com/WayfarerLabs/agentworks/compare/v0.3.0...v0.4.0) (2026-06-01)
44
+
45
+
46
+ ### Features
47
+
48
+ * **console:** configurable layout and restore-session ([73bdf68](https://github.com/WayfarerLabs/agentworks/commit/73bdf681581825c8838398bc291839ddb8cbe82f))
49
+ * **console:** configurable layout and restore-session for accidental shell kills ([5d5ae48](https://github.com/WayfarerLabs/agentworks/commit/5d5ae487869ac31bb82bad21f1b9bc191e0aacae))
50
+
51
+
52
+ ### Bug Fixes
53
+
54
+ * **console:** include console name in untagged-pane warnings and check set-option result ([a48adf8](https://github.com/WayfarerLabs/agentworks/commit/a48adf80dfb78bb6264918b55fef1072d5898b10))
55
+ * **console:** only mirror swap-pane into local map on success ([7f33652](https://github.com/WayfarerLabs/agentworks/commit/7f336525aa27ef4eedefd0d93c0c9a517e8c1f72))
56
+ * **console:** pass console name through _live_best_effort and refine restore-session error messages ([eec0b62](https://github.com/WayfarerLabs/agentworks/commit/eec0b62afb14cd946ccc9234ef19266f5340a6bd))
57
+ * **console:** restore-session raises on any partial split/tag failure ([97f72aa](https://github.com/WayfarerLabs/agentworks/commit/97f72aa32c65923ffe43ff844219b3e92ef0976d))
58
+ * **console:** shlex-quote cd-failure diagnostic and reword restore-session help ([c0fa16b](https://github.com/WayfarerLabs/agentworks/commit/c0fa16bda5c0de0348a998b27d9e4e5c8b711fb5))
59
+ * **console:** validate restore-session tag permutation, allowlist named_console, clean docstring and sample-config ([72d3815](https://github.com/WayfarerLabs/agentworks/commit/72d3815ea7ac6a84b13e8be175f9bc6e99a47d0d))
60
+
61
+
62
+ ### Performance Improvements
63
+
64
+ * **console:** single-pass tag validation, in-memory reorder, warn on missing pane id ([c8f8362](https://github.com/WayfarerLabs/agentworks/commit/c8f8362cb6f07c45744650f5ee579fc8da605696))
65
+
66
+
67
+ ### Documentation
68
+
69
+ * **console:** clarify reinit_workspace docstring on detection vs always-applied steps ([b7e548b](https://github.com/WayfarerLabs/agentworks/commit/b7e548bcf3396f3fa339551c0b93485209a20890))
70
+
3
71
  ## [0.3.0](https://github.com/WayfarerLabs/agentworks/compare/v0.2.1...v0.3.0) (2026-06-01)
4
72
 
5
73
 
@@ -0,0 +1,534 @@
1
+ Metadata-Version: 2.4
2
+ Name: agentworks-cli
3
+ Version: 0.5.0
4
+ Summary: CLI for orchestrating workspace lifecycle across multiple compute targets
5
+ Project-URL: Homepage, https://github.com/WayfarerLabs/agentworks
6
+ Project-URL: Repository, https://github.com/WayfarerLabs/agentworks
7
+ Project-URL: Issues, https://github.com/WayfarerLabs/agentworks/issues
8
+ Author: Scot Hastings (Wayfarer Labs)
9
+ License-Expression: MIT
10
+ Requires-Python: >=3.12
11
+ Requires-Dist: azure-identity>=1.25.1
12
+ Requires-Dist: azure-mgmt-compute>=37.0.1
13
+ Requires-Dist: azure-mgmt-network>=29.0.0
14
+ Requires-Dist: nerftools>=1.1.0
15
+ Requires-Dist: typer>=0.24.1
16
+ Description-Content-Type: text/markdown
17
+
18
+ # Agentworks CLI
19
+
20
+ The operator's command-line interface for managing agentic workloads on Agentworks.
21
+
22
+ For the project's problem space, core concepts, key principles, and tightly-integrated tool set, see
23
+ the [top-level README](../README.md). This document covers installing the CLI, the command surface,
24
+ configuration, and operational details.
25
+
26
+ ## Getting Started
27
+
28
+ Install from PyPI:
29
+
30
+ ```bash
31
+ uv tool install agentworks-cli
32
+ # or: pipx install agentworks-cli
33
+ ```
34
+
35
+ The everyday command is `agw`. The longer form `agentworks` is also installed if you ever want to
36
+ type it out; examples throughout this document use `agw`.
37
+
38
+ ```bash
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
44
+ ```
45
+
46
+ ## Prerequisites
47
+
48
+ - Python 3.12+ (uv will install one for you if needed)
49
+ - [uv](https://docs.astral.sh/uv/) or [pipx](https://pipx.pypa.io/) for installation
50
+ - [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)
52
+
53
+ ## Global Options
54
+
55
+ | Flag | Description |
56
+ | ------------------- | ---------------------------------------------------------------------------- |
57
+ | `--non-interactive` | Disable all interactive prompts |
58
+ | `--debug` | Print the full Python traceback on unhandled errors (also via `AGW_DEBUG=1`) |
59
+
60
+ When `--non-interactive` is set (or stdin is not a TTY), commands that would normally prompt for
61
+ missing values (VM selection, workspace selection, name generation) will fail with a clear error
62
+ indicating which flag is required. Auto-selection still works: if there is exactly one VM or
63
+ workspace, it is used without prompting.
64
+
65
+ Domain errors (SSH timeouts, validation failures, missing resources, etc.) surface as a single clean
66
+ line: `Error: <message>`. Truly unexpected failures (internal bugs, OS-level errors, third-party
67
+ library failures) also get a clean single-line message, plus the full traceback appended to
68
+ `~/.config/agentworks/logs/error.log` for debugging. Pass `--debug` (or set `AGW_DEBUG=1`) to print
69
+ the traceback to stderr instead.
70
+
71
+ Pressing Ctrl-C during a long-running operation triggers best-effort cleanup. Where the operation
72
+ can roll back (e.g. `vm create` during the provisioning phase, `workspace create`, `agent create`,
73
+ `session create`) it undoes the partial DB / on-VM state and prints `Cancelling X... rolling back.`.
74
+ Where rollback isn't possible (`vm reinit`, `agent reinit`, the init phase of `vm create`) it prints
75
+ a recovery hint: the next command to run (`vm reinit`, `vm delete --force`, ...). Every cancellation
76
+ exits with the conventional SIGINT exit code (130).
77
+
78
+ ## Commands
79
+
80
+ ### Top-level
81
+
82
+ | Command | Description |
83
+ | ------------------------ | -------------------------------------- |
84
+ | `agw doctor` | Check environment and config |
85
+ | `agw completion show` | Print the completion script to stdout |
86
+ | `agw completion install` | Install the completion script in-place |
87
+
88
+ ### VM Hosts
89
+
90
+ Manage machines that host VMs (for remote Lima mode).
91
+
92
+ | Command | Description |
93
+ | ----------------------------------- | ------------------------ |
94
+ | `agw vm-host add <name> <ssh-host>` | Register a VM host |
95
+ | `agw vm-host list` | List registered VM hosts |
96
+ | `agw vm-host remove <name>` | Remove a VM host |
97
+
98
+ `vm-host remove` refuses if the host has VMs registered against it; pass `--force` to clear those
99
+ VMs' `vm_host_name` reference and remove the host anyway. When the host has no VMs and you run
100
+ without `--force` or `--yes`, the command prompts for confirmation. Both `--yes` and `--force` also
101
+ bypass the confirmation prompt.
102
+
103
+ ### VMs
104
+
105
+ Manage virtual machines across Lima (local or remote), Azure, and WSL2.
106
+
107
+ | Command | Description |
108
+ | ----------------------------------------- | ------------------------------------------ |
109
+ | `agw vm create <name>` | Create a new VM (provision + initialize) |
110
+ | `agw vm list` | List VMs with status and resources |
111
+ | `agw vm describe <name>` | Show VM details, workspaces, and event log |
112
+ | `agw vm shell <name>` | SSH into a VM's home directory |
113
+ | `agw vm start <name>` | Start a stopped VM |
114
+ | `agw vm stop <name>` | Stop a running VM |
115
+ | `agw vm reinit <name>` | Re-run initialization on a provisioned VM |
116
+ | `agw vm delete <name>` | Delete a VM (with confirmation) |
117
+ | `agw vm logs <name>` | Show SSH logs for a VM |
118
+ | `agw vm console <name>` | _Deprecated_: use `agw console` |
119
+ | `agw vm add-git-credential <name> <cred>` | Add or update a git credential |
120
+
121
+ `vm create <name>` takes the VM name as a required positional. Optional flags: `--platform`,
122
+ `--vm-host`, `--admin-username`, `--cpus`, `--memory`, `--disk`, and `--azure-vm-size`. These are
123
+ immutable provisioning parameters stored in the database. All initialization behavior (packages,
124
+ install commands, etc.) is driven by config.
125
+
126
+ `vm reinit` re-runs the initialization phase using the current config without reprovisioning the VM.
127
+ Changes to config (new packages, different install commands, etc.) are picked up automatically.
128
+
129
+ `vm delete` requires `--force` if the VM has workspaces, agents, or sessions. The confirmation
130
+ message shows what will be deleted. Pass `--yes` to skip the prompt.
131
+
132
+ ### Workspaces
133
+
134
+ Manage workspaces on VMs.
135
+
136
+ | Command | Description |
137
+ | ------------------------------------ | ----------------------------------- |
138
+ | `agw workspace create <name>` | Create a workspace on a VM |
139
+ | `agw workspace describe <name>` | Show workspace details and sessions |
140
+ | `agw workspace shell <name>` | Open a plain shell into a workspace |
141
+ | `agw workspace console <name>` | Open the workspace console (tmux) |
142
+ | `agw workspace list` | List workspaces |
143
+ | `agw workspace copy <source> <name>` | Copy a workspace to a new VM |
144
+ | `agw workspace rehome <name>` | Move workspace to a new path |
145
+ | `agw workspace reinit <name>` | Reinit workspace infrastructure |
146
+ | `agw workspace delete <name>` | Delete a workspace |
147
+
148
+ `workspace create <name>` takes the workspace name as a required positional. Optional flags: `--vm`,
149
+ `--template`, and `--open-vscode`.
150
+
151
+ `workspace console` opens a tmuxinator session (`ws-<name>-console`) with an admin-shell window plus
152
+ one window per session in the workspace. Pass `--recreate` to kill and rebuild the console. This is
153
+ the recommended way to interact with sessions from within VS Code or any terminal on the VM.
154
+
155
+ `workspace copy <source> <name>` copies a workspace to a new VM workspace. Accepts `--vm`. Source
156
+ and destination can be the same VM (a clone) or different VMs.
157
+
158
+ `workspace delete` requires `--force` if the workspace has sessions. Running sessions are killed
159
+ during deletion. Pass `--yes` to skip the confirmation prompt.
160
+
161
+ ### Agents
162
+
163
+ Manage agents (isolated Linux users) on VMs. Agents are VM-scoped and access workspaces via grants.
164
+
165
+ | Command | Description |
166
+ | -------------------------------------------- | ------------------------------ |
167
+ | `agw agent create <name> [--vm]` | Create an agent on a VM |
168
+ | `agw agent list [--vm <vm>]` | List agents |
169
+ | `agw agent describe <name>` | Show agent details and grants |
170
+ | `agw agent reinit <name>` | Re-run agent setup |
171
+ | `agw agent grant-workspaces <name> <ws>...` | Grant workspace access |
172
+ | `agw agent grant-workspaces <name> --all` | Grant access to all workspaces |
173
+ | `agw agent revoke-workspaces <name> <ws>...` | Revoke workspace access |
174
+ | `agw agent revoke-workspaces <name> --all` | Revoke all explicit grants |
175
+ | `agw agent shell <name> [--workspace <ws>]` | Shell into an agent |
176
+ | `agw agent delete <name>` | Delete an agent |
177
+
178
+ `agent create <name>` takes the agent name as a required positional. Optional flags: `--vm`,
179
+ `--template`, and `--grant-all-workspaces`.
180
+
181
+ `agent delete` requires `--force` if the agent has running sessions. Pass `--yes` to skip the
182
+ confirmation prompt.
183
+
184
+ ### Sessions
185
+
186
+ Manage sessions (persistent tmux sessions running in workspaces). Session names are globally unique
187
+ -- no `--workspace` flag needed for most commands.
188
+
189
+ | Command | Description |
190
+ | ----------------------------- | ------------------------------ |
191
+ | `agw session create <name>` | Create and start a session |
192
+ | `agw session describe <name>` | Show session details |
193
+ | `agw session list` | List sessions with status |
194
+ | `agw session attach <name>` | Attach to a running session |
195
+ | `agw session stop <name>` | Stop a running session |
196
+ | `agw session restart <name>` | Restart a session |
197
+ | `agw session delete <name>` | Stop and delete a session |
198
+ | `agw session logs <name>` | Dump session scrollback buffer |
199
+ | `agw console attach <name>` | Attach to a named console |
200
+
201
+ `session list` accepts `--workspace`, `--vm`, `--agent`, and `--admin` to narrow the result set.
202
+ Filters compose with AND. The name filters (`--workspace`, `--vm`, `--agent`) accept a single value
203
+ or a comma-separated list (`--vm vm1,vm2`); commas within a filter are OR-ed together.
204
+ `--agent <name>` matches agent-mode sessions only; `--admin` matches admin-mode sessions only (the
205
+ two are mutually exclusive).
206
+
207
+ `session create <name>` takes the session name as a required positional. Optional flags:
208
+ `--workspace`, `--template`, `--admin`, and `--agent`. Workspace and mode (admin vs agent) are
209
+ prompted interactively if omitted; if agents exist on the VM and neither `--admin` nor `--agent` is
210
+ specified, you are prompted to choose. Pass `--new-workspace` to create a workspace on the fly (with
211
+ optional `--workspace-name`, `--workspace-template`, and `--vm`; `--workspace-name` defaults to the
212
+ session name). Pass `--new-agent` to create a new agent for the session (with optional
213
+ `--agent-name` and `--agent-template`; `--agent-name` defaults to the session name); the new agent
214
+ is provisioned on the workspace's VM. When a session created with `--new-workspace` or `--new-agent`
215
+ is later deleted, you are offered the option to delete the workspace and/or agent as well -- the
216
+ workspace if no other sessions remain on it, the agent if it has no other sessions and no explicit
217
+ grants.
218
+
219
+ <!-- Linked from the top-level README; rename only if you also update README.md. -->
220
+
221
+ ### Named consoles
222
+
223
+ Named consoles are persistent, curated tmux views over sessions on a VM. Each console is its own
224
+ tmux session (`aw-console-<name>`) containing one window per included session, plus any extra shell
225
+ panes you want preloaded into a session's window.
226
+
227
+ | Command | Description |
228
+ | --------------------------------------------------- | ----------------------------------------------------------------- |
229
+ | `agw console create <name> [sessions...]` | Create a console with the given sessions |
230
+ | `agw console list` | List consoles |
231
+ | `agw console describe <name>` | Show membership and shell layout |
232
+ | `agw console attach <name>` | Attach (builds tmux state on first attach) |
233
+ | `agw console delete <name>` | Tear down and remove the console |
234
+ | `agw console add-sessions <name> <sessions...>` | Add session windows |
235
+ | `agw console remove-sessions <name> <sessions...>` | Remove session windows |
236
+ | `agw console reorder-sessions <name> <sessions...>` | Bump member sessions to the front in the order given |
237
+ | `agw console add-shell <name> <session>` | Add a shell pane to a session window (accepts `--cwd`, `--admin`) |
238
+
239
+ `console create` accepts:
240
+
241
+ - `--vm` -- target VM. **Inferred from the listed sessions when omitted**; if the listed sessions
242
+ span more than one VM, `console create` errors and asks you to pick one with `--vm`. When no
243
+ sessions are listed (e.g. with `--all` and no explicit specs), VM selection falls back to the
244
+ standard prompt (auto-picked if you have a single VM, prompted otherwise).
245
+ - `--all` -- include every session on the VM with 0 shells, appended after the explicit specs
246
+ (alphabetical).
247
+ - `--all-running` -- like `--all` but restricted to sessions whose live tmux state on the VM is OK
248
+ (one SSH round-trip; same probe `agw session list` uses). Mutually exclusive with `--all`.
249
+ Requires the VM to be reachable.
250
+ - `--add-admin-shell` -- include a top-level admin-shell window as window 0, matching the legacy
251
+ `vm console` behavior.
252
+
253
+ `console list` accepts `--vm`, `--workspace`, and `--agent` to narrow the result set. Each filter
254
+ takes a single value or a comma-separated list (`--workspace ws1,ws2`); commas within a filter are
255
+ OR-ed together. The `--workspace` and `--agent` filters use "any session matches" semantics: a
256
+ console is listed if at least one of its member sessions belongs to the given workspace / runs as
257
+ the given agent. When `--workspace` and `--agent` are both passed, the SAME session must satisfy
258
+ both predicates. The session count displayed is the total membership, not the count of matching
259
+ sessions. Filters compose with AND.
260
+
261
+ Session specs use `name` or `name+N` shorthand, where `N` is the number of default shell panes to
262
+ pre-open in that session's window (running as the session's agent user, cwd = workspace root):
263
+
264
+ ```sh
265
+ # A console with three sessions; the first two get extra shells.
266
+ # VM is inferred from the sessions.
267
+ agw console create backend auth-server+2 auth-tests+1 docs
268
+
269
+ # Same, but also include a top-level admin-shell window (window 0).
270
+ agw console create backend auth-server+2 auth-tests+1 docs --add-admin-shell
271
+
272
+ # Everything currently running on the VM, after the explicit specs.
273
+ agw console create live auth-server+2 --all-running
274
+
275
+ # All sessions on the VM (running or not). Needs --vm since no sessions are
276
+ # named explicitly to infer from.
277
+ agw console create everything --vm aw-private --all
278
+
279
+ # Add an admin shell rooted in a sub-path of the workspace.
280
+ agw console add-shell backend auth-server --cwd src/api --admin
281
+ ```
282
+
283
+ Memberships and shell layouts persist in the database. `agw console attach` builds the tmux session
284
+ on first attach (or with `--recreate`); subsequent attaches reuse the running tmux session. Adding
285
+ or removing sessions/shells while a console is attached updates the live tmux state immediately
286
+ (best-effort); when the console isn't running on the VM, only the DB is updated and changes appear
287
+ on next attach.
288
+
289
+ <!-- Linked from the top-level README; rename only if you also update README.md. -->
290
+
291
+ ### tmux Architecture
292
+
293
+ Each session runs in its own locked-down tmux session on the VM. There are several ways to interact
294
+ with sessions, at different scopes:
295
+
296
+ | Method | Scope | tmux session name | Entry point |
297
+ | ------------------------- | -------------------------------- | ------------------------ | --------------------------- |
298
+ | `session attach` | One session | `<session-name>` | Operator's machine |
299
+ | `workspace console` | One workspace | `ws-<workspace>-console` | On-VM or operator's machine |
300
+ | `console` | Curated subset across workspaces | `aw-console-<name>` | Operator's machine |
301
+ | `vm console` (deprecated) | All sessions on the VM | `vm-console` | Operator's machine |
302
+
303
+ #### Session tmux sessions
304
+
305
+ Each session gets a locked-down tmux session using the session name directly as the tmux session
306
+ name. The user's `~/.tmux.conf` (customizable via dotfiles) is loaded first so that familiar
307
+ keybindings (prefix, detach, copy mode, scroll) work for direct `session attach`. Window/pane
308
+ creation, session management, and the command prompt are selectively unbound.
309
+
310
+ Agent-mode sessions run on a per-agent tmux socket so the agent's shell connects directly to the
311
+ tmux pane PTY. The socket path is persisted in the database.
312
+
313
+ #### Workspace console
314
+
315
+ `workspace console` uses tmuxinator to create or attach to a `ws-<name>-console` session. The
316
+ tmuxinator config (`.tmuxinator.yml` in the workspace root) is regenerated whenever sessions change,
317
+ so the console always reflects the current set of sessions. Best for in-VM work scoped to a single
318
+ workspace (e.g. inside VS Code's integrated terminal). For curated views that span workspaces, use a
319
+ named console (`console attach <name>`).
320
+
321
+ ```text
322
+ ws-myproject-console (tmuxinator, full tmux)
323
+ Window 1: admin-shell login shell for the admin user
324
+ Window 2: myproject-claude attached to session
325
+ Window 3: myproject-debug attached to session
326
+ ```
327
+
328
+ #### Named console
329
+
330
+ `console attach <name>` creates or attaches to the `aw-console-<name>` tmux session. Membership and
331
+ per-session shell layout are stored in the database. Each member session becomes a window running
332
+ the same wrapper used by the workspace and VM consoles, plus a configurable number of extra shell
333
+ panes (default user = session's agent user, default cwd = workspace root; override per pane with
334
+ `--cwd` / `--admin` on `console add-shell`).
335
+
336
+ ```text
337
+ aw-console-backend
338
+ Window 1: auth-server attached session + 2 agent shells (workspace root)
339
+ Window 2: auth-tests attached session + 1 agent shell
340
+ Window 3: docs attached session only
341
+ ```
342
+
343
+ The tmux session is built lazily on first `attach` (or rebuilt with `--recreate`). Adding or
344
+ removing sessions/shells while the console is attached updates tmux immediately; when offline, only
345
+ the DB is touched and changes appear on next attach. The mutation commands (`add-sessions`,
346
+ `remove-sessions`, `reorder-sessions`, `add-shell`) never auto-boot the VM; the explicit
347
+ attach/repair commands (`attach`, `restore-session`) do start a stopped VM, since their job is to
348
+ bring live state up.
349
+
350
+ #### VM console (deprecated)
351
+
352
+ `vm console` creates or attaches to the `vm-console` session, which spans all sessions on the VM.
353
+ Built dynamically (not via tmuxinator). Superseded by named consoles, which let you curate which
354
+ sessions are in scope at any moment instead of seeing every session on the VM. Will be removed in a
355
+ future release.
356
+
357
+ #### Shells
358
+
359
+ `workspace shell` and `vm shell` open plain login shells with no tmux. Use these when you just need
360
+ a terminal without the console structure.
361
+
362
+ #### Key behaviors
363
+
364
+ - **Direct attach** (`session attach`): the user's prefix key, detach, copy mode, and scroll all
365
+ work normally. Status bar is hidden since there is only one pane.
366
+ - **Consoles** (`workspace console`, `vm console`): the console's prefix key eclipses the inner
367
+ session's prefix, so window switching, detach, etc. all operate at the console level. Session
368
+ windows use a wrapper that re-attaches if the inner session disconnects and shows a message when
369
+ the session ends.
370
+ - **Nesting protection**: both console commands refuse to run inside an existing tmux session to
371
+ avoid prefix key conflicts. Pass `--allow-nesting` to override.
372
+ - **Console lifecycle**: consoles are independent of sessions. Killing or detaching a console does
373
+ not affect running sessions. `--recreate` rebuilds from scratch.
374
+
375
+ ### Session Templates
376
+
377
+ Templates define the command a session runs. The built-in `default` template runs a login shell
378
+ (`$SHELL --login`), respecting whatever shell the user (admin or agent) is configured with. Define
379
+ custom templates in config:
380
+
381
+ ```toml
382
+ [session_templates.default] # override the built-in default
383
+ command = "claude --name {{session_name}}"
384
+ restart_command = "claude --resume {{session_name}}"
385
+ description = "Claude Code interactive session"
386
+ ```
387
+
388
+ Template commands support `{{session_name}}` and `{{workspace_name}}` variable substitution
389
+ (double-brace syntax, consistent with nerftools manifests). The optional `restart_command` is used
390
+ by `session restart` -- useful for tools like Claude Code where `--resume` picks up the previous
391
+ conversation. If omitted, the regular `command` is used.
392
+
393
+ ### Catalog
394
+
395
+ Browse and inspect the built-in catalog of installable tools.
396
+
397
+ | Command | Description |
398
+ | ----------------------------- | ---------------------------------- |
399
+ | `agw catalog list` | List all available catalog entries |
400
+ | `agw catalog describe <name>` | Show details of a catalog entry |
401
+
402
+ `catalog list` accepts `--type` (apt-source, apt-package, system-install-cmd, user-install-cmd) and
403
+ `--source` (built-in, custom) filters.
404
+
405
+ ### Config
406
+
407
+ | Command | Description |
408
+ | ----------------------------------- | -------------------------------------------- |
409
+ | `agw config init` | Create a sample config file |
410
+ | `agw config edit` | Open config in `$EDITOR` |
411
+ | `agw config sample` | Print the sample config to stdout |
412
+ | `agw config sync-ssh-config` | Rebuild SSH config entries for all VMs |
413
+ | `agw config sync-vscode-workspaces` | Regenerate .code-workspace files for all VMs |
414
+
415
+ ## Configuration
416
+
417
+ Config lives at `~/.config/agentworks/config.toml`. Run `agw config init` to generate a sample with
418
+ all options documented. See [sample-config.toml](agentworks/sample-config.toml) for the full
419
+ reference.
420
+
421
+ Key sections:
422
+
423
+ - `[operator]` -- SSH keys (required), additional authorized keys, SSH config management
424
+ - `[paths]` -- VM workspace and VS Code workspace file directories
425
+ - `[defaults]` -- default platform, VM host
426
+ - `[vm_templates.*]` -- VM resources, apt packages, system install commands, mise
427
+ - `[admin.config]` -- admin user shell, dotfiles, git credentials, user install commands, mise
428
+ - `[agent_templates.*]` -- agent user shell, dotfiles, git credentials, user install commands, mise
429
+ - `[session.config]` -- session defaults (history limit)
430
+ - `[session_templates.*]` -- session templates with variable substitution
431
+ - `[workspace_templates.*]` -- workspace templates with inheritance
432
+ - `[named_console]` -- named-console layout (tmux preset name)
433
+ - `[git_credentials.*]` -- git credential providers (GitHub, Azure DevOps)
434
+ - `[apt_sources.*]` -- user-defined third-party apt repositories
435
+ - `[apt_packages.*]` -- user-defined named apt package sets
436
+ - `[system_install_commands.*]` -- user-defined system-level install commands
437
+ - `[user_install_commands.*]` -- user-defined per-user install commands
438
+ - `[azure]` -- Azure-specific settings
439
+ - `[proxmox]` -- Proxmox VE API settings
440
+
441
+ ### Mise (Polyglot Tool Manager)
442
+
443
+ Agentworks installs [mise](https://mise.jdx.dev/) by default on all VMs for managing CLI tools
444
+ (terraform, adr-tools, node, etc.) with optional lockfile-based integrity verification. See
445
+ [Using mise](../docs/guides/mise.md) for the full guide.
446
+
447
+ ### Nerf Tools (Claude Code Plugin)
448
+
449
+ Agentworks can build and deploy a Claude Code plugin containing "nerf tools" -- scoped,
450
+ safety-constrained wrappers for CLI operations like git, az, and other tools. Nerf tools enforce
451
+ guardrails (validated parameters, restricted flags, pre-flight checks) so AI agents operate safely.
452
+
453
+ Enable in your VM template:
454
+
455
+ ```toml
456
+ [vm_templates.default]
457
+ nerf_build_claude_plugin = true
458
+ ```
459
+
460
+ This builds the plugin to `nerf_home_dir/claude-plugin/` during VM init. To auto-install the plugin
461
+ for users, add to admin or agent config:
462
+
463
+ ```toml
464
+ [admin.config]
465
+ nerf_install_claude_plugin = true
466
+ ```
467
+
468
+ The plugin provides skills that document available tools, and operator commands for managing
469
+ permissions (`/nerftools:nerfctl-grant-allow`, `/nerftools:nerfctl-grant-deny`, etc.). Custom tool
470
+ manifests can be added via `nerf_addl_manifests`.
471
+
472
+ Plugin identity (name, marketplace metadata) is defined in agentworks' own `nerf-config.yaml` and
473
+ loaded via the nerftools config API. The version is a date-based build stamp that changes on each
474
+ reinit. The build always emits an embedded marketplace so the plugin directory is installable
475
+ standalone via `claude plugin marketplace add`.
476
+
477
+ ### Built-in Catalog
478
+
479
+ Agentworks ships a built-in catalog of common tools (apt sources, apt packages, system install
480
+ commands, and user install commands). Run `agw catalog list` to see what is available. Reference
481
+ catalog entries by name in `vm_templates`, `admin.config`, and `agent_templates`. User-defined
482
+ entries in your config override built-in entries with the same name.
483
+
484
+ ## VM Initialization
485
+
486
+ VM creation follows a two-phase lifecycle tracked by separate status columns:
487
+
488
+ 1. **Provisioning** (`provisioning_status`) -- one-time, platform-specific, over the provisioning
489
+ transport (Lima shell, SSH, or WSL2 exec): create user, install system packages, add SSH key,
490
+ install and join Tailscale
491
+
492
+ 2. **Initialization** (`init_status`) -- repeatable via `vm reinit`, over Tailscale SSH: configure
493
+ apt sources, install apt packages, install snap packages, install mise, set shell, reconcile SSH
494
+ authorized keys, run system install commands, write mise config, configure PATH, configure git
495
+ credentials, sync dotfiles, fetch mise lockfile, run mise install, run user install commands for
496
+ the admin user
497
+
498
+ Initialization is fully declarative -- driven entirely by config. `vm create` only accepts immutable
499
+ provisioning parameters (name, platform, resources). `vm reinit` takes only the VM name and re-runs
500
+ initialization using the current config.
501
+
502
+ Non-fatal initialization failures (packages, dotfiles) produce a `partial` status rather than
503
+ aborting. Fatal failures prompt for deletion or reinit. Use `vm describe` to view the full event
504
+ log.
505
+
506
+ ## Shell Completion
507
+
508
+ ```bash
509
+ agw completion install
510
+ ```
511
+
512
+ The shell is autodetected from `$SHELL`; pass `--shell {bash|zsh|powershell}` to override (or when
513
+ autodetection isn't unambiguous, e.g. on Windows). `completion install` writes the script to the
514
+ standard location for that shell. For PowerShell it also appends a dot-source line (`. "..."`) to
515
+ `$PROFILE`. For bash and zsh, if your rc file is missing the loader (`bash-completion` for bash,
516
+ `fpath=(~/.zfunc $fpath)` for plain zsh without a plugin manager), the installer prints a one-line
517
+ note telling you what to add.
518
+
519
+ To print the script without installing, use `agw completion show` (handy for piping into your own
520
+ config-management flow).
521
+
522
+ Completions include dynamic VM, workspace, VM host, session, and template name lookups.
523
+
524
+ ## State
525
+
526
+ All state is stored in `~/.config/agentworks/agentworks.db` (SQLite). Schema migrations are
527
+ forward-only and run automatically.
528
+
529
+ ## Environment Variables
530
+
531
+ | Variable | Description |
532
+ | ----------------------------- | ----------------------------------------------- |
533
+ | `TAILSCALE_AUTH_KEY` | Tailscale auth key (skips prompt) |
534
+ | `GIT_CREDENTIALS_<CRED_NAME>` | Git credential for `<CRED_NAME>` (skips prompt) |