agsekit 0.0.1__py3-none-any.whl

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 (117) hide show
  1. agsekit-0.0.1.data/data/share/agsekit/config-example.yaml +63 -0
  2. agsekit-0.0.1.dist-info/METADATA +279 -0
  3. agsekit-0.0.1.dist-info/RECORD +117 -0
  4. agsekit-0.0.1.dist-info/WHEEL +5 -0
  5. agsekit-0.0.1.dist-info/entry_points.txt +2 -0
  6. agsekit-0.0.1.dist-info/licenses/LICENSE +21 -0
  7. agsekit-0.0.1.dist-info/top_level.txt +1 -0
  8. agsekit_cli/__init__.py +1 -0
  9. agsekit_cli/agent_scripts/claude-code.sh +12 -0
  10. agsekit_cli/agent_scripts/codex-glibc.sh +212 -0
  11. agsekit_cli/agent_scripts/codex.sh +99 -0
  12. agsekit_cli/agent_scripts/proxychains_common.sh +105 -0
  13. agsekit_cli/agent_scripts/qwen.sh +99 -0
  14. agsekit_cli/agents.py +370 -0
  15. agsekit_cli/agents_modules/__init__.py +47 -0
  16. agsekit_cli/agents_modules/aider.py +6 -0
  17. agsekit_cli/agents_modules/base.py +72 -0
  18. agsekit_cli/agents_modules/claude.py +6 -0
  19. agsekit_cli/agents_modules/cline.py +7 -0
  20. agsekit_cli/agents_modules/codex.py +7 -0
  21. agsekit_cli/agents_modules/codex_glibc.py +6 -0
  22. agsekit_cli/agents_modules/codex_glibc_prebuilt.py +6 -0
  23. agsekit_cli/agents_modules/forgecode.py +13 -0
  24. agsekit_cli/agents_modules/opencode.py +7 -0
  25. agsekit_cli/agents_modules/qwen.py +7 -0
  26. agsekit_cli/ansible/agents/aider.yml +70 -0
  27. agsekit_cli/ansible/agents/claude.yml +120 -0
  28. agsekit_cli/ansible/agents/cline.yml +120 -0
  29. agsekit_cli/ansible/agents/codex-glibc-prebuilt.yml +141 -0
  30. agsekit_cli/ansible/agents/codex-glibc.yml +261 -0
  31. agsekit_cli/ansible/agents/codex.yml +125 -0
  32. agsekit_cli/ansible/agents/codex_logrotate.yml +24 -0
  33. agsekit_cli/ansible/agents/forgecode.yml +70 -0
  34. agsekit_cli/ansible/agents/opencode.yml +125 -0
  35. agsekit_cli/ansible/agents/proxychains.yml +46 -0
  36. agsekit_cli/ansible/agents/qwen.yml +120 -0
  37. agsekit_cli/ansible/bundles/docker.yml +88 -0
  38. agsekit_cli/ansible/bundles/golang.yml +31 -0
  39. agsekit_cli/ansible/bundles/nodejs.yml +62 -0
  40. agsekit_cli/ansible/bundles/nvm.yml +40 -0
  41. agsekit_cli/ansible/bundles/pyenv.yml +65 -0
  42. agsekit_cli/ansible/bundles/python.yml +48 -0
  43. agsekit_cli/ansible/bundles/rust.yml +49 -0
  44. agsekit_cli/ansible/callback_plugins/agsekit_progress.py +188 -0
  45. agsekit_cli/ansible/callback_plugins/agsekit_rich.py +112 -0
  46. agsekit_cli/ansible/connection_plugins/agsekit_multipass.py +166 -0
  47. agsekit_cli/ansible/vm_packages.yml +68 -0
  48. agsekit_cli/ansible/vm_ssh.yml +94 -0
  49. agsekit_cli/ansible_runners.py +64 -0
  50. agsekit_cli/ansible_utils.py +303 -0
  51. agsekit_cli/backup.py +665 -0
  52. agsekit_cli/cli.py +224 -0
  53. agsekit_cli/cli_entry.py +44 -0
  54. agsekit_cli/commands/__init__.py +21 -0
  55. agsekit_cli/commands/addmount.py +502 -0
  56. agsekit_cli/commands/backup_clean.py +76 -0
  57. agsekit_cli/commands/backup_once.py +31 -0
  58. agsekit_cli/commands/backup_repeated.py +181 -0
  59. agsekit_cli/commands/check_new_version.py +50 -0
  60. agsekit_cli/commands/config_example.py +42 -0
  61. agsekit_cli/commands/config_gen.py +518 -0
  62. agsekit_cli/commands/create_vm.py +209 -0
  63. agsekit_cli/commands/daemon.py +137 -0
  64. agsekit_cli/commands/destroy_vm.py +119 -0
  65. agsekit_cli/commands/doctor.py +542 -0
  66. agsekit_cli/commands/down.py +131 -0
  67. agsekit_cli/commands/install_agents.py +433 -0
  68. agsekit_cli/commands/list_bundles.py +20 -0
  69. agsekit_cli/commands/mounts.py +139 -0
  70. agsekit_cli/commands/pip_upgrade.py +161 -0
  71. agsekit_cli/commands/portforward.py +339 -0
  72. agsekit_cli/commands/prepare.py +68 -0
  73. agsekit_cli/commands/removemount.py +179 -0
  74. agsekit_cli/commands/restart_vm.py +86 -0
  75. agsekit_cli/commands/run.py +482 -0
  76. agsekit_cli/commands/shell.py +77 -0
  77. agsekit_cli/commands/ssh.py +147 -0
  78. agsekit_cli/commands/start_vm.py +88 -0
  79. agsekit_cli/commands/status.py +611 -0
  80. agsekit_cli/commands/stop.py +151 -0
  81. agsekit_cli/commands/systemd.py +139 -0
  82. agsekit_cli/commands/up.py +109 -0
  83. agsekit_cli/commands/version.py +20 -0
  84. agsekit_cli/config.py +1024 -0
  85. agsekit_cli/daemon_backends.py +371 -0
  86. agsekit_cli/debug.py +81 -0
  87. agsekit_cli/host_tools.py +182 -0
  88. agsekit_cli/i18n.py +67 -0
  89. agsekit_cli/interactive.py +644 -0
  90. agsekit_cli/locales/en.json +862 -0
  91. agsekit_cli/locales/ru.json +862 -0
  92. agsekit_cli/mounts.py +232 -0
  93. agsekit_cli/prebuilt.py +243 -0
  94. agsekit_cli/prepare_strategies.py +455 -0
  95. agsekit_cli/progress.py +232 -0
  96. agsekit_cli/provision_handlers.py +378 -0
  97. agsekit_cli/run_agent.sh +176 -0
  98. agsekit_cli/run_with_http_proxy.sh +309 -0
  99. agsekit_cli/run_with_proxychains.sh +46 -0
  100. agsekit_cli/state.py +197 -0
  101. agsekit_cli/systemd/agsekit-portforward.service +13 -0
  102. agsekit_cli/systemd_backend.py +312 -0
  103. agsekit_cli/tui_prompts.py +154 -0
  104. agsekit_cli/versioning.py +133 -0
  105. agsekit_cli/vm.py +737 -0
  106. agsekit_cli/vm_bundle_definitions.py +58 -0
  107. agsekit_cli/vm_bundles.py +92 -0
  108. agsekit_cli/vm_installers/docker.sh +38 -0
  109. agsekit_cli/vm_installers/golang.sh +13 -0
  110. agsekit_cli/vm_installers/nodejs.sh +35 -0
  111. agsekit_cli/vm_installers/nvm.sh +33 -0
  112. agsekit_cli/vm_installers/pyenv.sh +55 -0
  113. agsekit_cli/vm_installers/python.sh +29 -0
  114. agsekit_cli/vm_installers/rust.sh +30 -0
  115. agsekit_cli/vm_local_control_node.py +247 -0
  116. agsekit_cli/vm_prepare.py +375 -0
  117. agsekit_cli/vm_ssh_bootstrap.py +145 -0
@@ -0,0 +1,63 @@
1
+ global: # global agsekit settings
2
+ ssh_keys_folder: null # if set, overrides the folder with SSH keys used to connect to VMs; default: ~/.config/agsekit/ssh
3
+ systemd_env_folder: null # if set, overrides the folder where agsekit writes systemd.env; default: ~/.config/agsekit
4
+ state_file: null # if set, overrides the agsekit internal state file path; default: ~/.config/agsekit/state.yaml
5
+ portforward_config_check_interval_sec: 10 # how often portforward reloads the config and reconciles tunnels
6
+ check_new_version: true # whether agsekit should periodically check PyPI for a newer version
7
+ check_new_version_interval_sec: 600 # how often agsekit should check PyPI for a newer version
8
+ http_proxy_port_pool: # automatic listen port range for VM-local HTTP proxy helper
9
+ start: 48000
10
+ end: 49000
11
+ vms: # virtual machine settings (you can define multiple VMs)
12
+ agent-ubuntu: # virtual machine name
13
+ cpu: 2 # number of vCPUs
14
+ ram: 4G # amount of RAM
15
+ disk: 20G # disk size
16
+ allowed_agents: aider, qwen, forgecode, codex, opencode, claude, cline # optional: also accepts a list like [qwen, codex]; if omitted, all agents are allowed for this VM
17
+ proxychains: "" # set a proxy URL (scheme://host:port); agsekit will generate a temporary proxychains.conf and wrap Multipass commands
18
+ http_proxy: "" # optional shorthand for VM-local privoxy upstream (for example socks5://127.0.0.1:8181); for direct mode use a mapping with url:
19
+ cloud-init: {} # optional standard cloud-init config
20
+ port-forwarding: # port forwarding applied when running agents and related commands
21
+ - type: remote
22
+ host-addr: 127.0.0.1:80
23
+ vm-addr: 127.0.0.1:8080
24
+ - type: local
25
+ host-addr: 0.0.0.0:15432
26
+ vm-addr: 127.0.0.1:5432
27
+ - type: socks5
28
+ vm-addr: 127.0.0.1:8088
29
+ install: # software bundles installed into the VM during create-vm/create-vms
30
+ - python # pyenv + latest stable Python
31
+ - nodejs:20 # nvm + Node.js version 20
32
+ - rust # rustup + toolchain
33
+ mounts:
34
+ - source: /host/path/project # source folder path on the host
35
+ target: /home/ubuntu/project # mount point inside the VM; if omitted, /home/ubuntu/<source_folder_name> is used
36
+ backup: /host/backups/project # backup directory; if omitted, backups-<folder_name> next to source is used
37
+ allowed_agents: qwen, codex # optional: also accepts a list like [qwen, codex]; spaces after commas are ignored
38
+ interval: 5 # backup interval in minutes; default: 5
39
+ max_backups: 100 # number of snapshots to keep; default: 100
40
+ backup_clean_method: thin # cleanup method (tail or thin); default: thin
41
+ first_backup: true # make a blocking pre-run snapshot before agent start when snapshots already exist; default: true
42
+ vm: agent-ubuntu # VM name; if omitted, the first VM from the config is used
43
+ agents:
44
+ qwen: # agent name; add as many as you need
45
+ type: qwen # agent type: aider, qwen, forgecode (uses the forge binary and forces FORGE_TRACKER=false), codex, opencode, codex-glibc, codex-glibc-prebuilt (uses the codex-glibc-prebuilt binary), claude, or cline
46
+ proxychains: "" # optional agent proxy URL (scheme://host:port); if this field is present, it overrides the VM proxychains setting even when empty
47
+ http_proxy: # optional HTTP proxy for agsekit run; overrides VM-level http_proxy
48
+ upstream: socks5://127.0.0.1:8181
49
+ listen: 127.0.0.1:8585
50
+ env: # arbitrary environment variables passed to the agent
51
+ OPENAI_API_KEY: "my_local_key"
52
+ OPENAI_BASE_URL: "https://127.0.0.1:11556/v1"
53
+ OPENAI_MODEL: "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
54
+ default-args: # arguments passed to the agent unless the user overrides them explicitly
55
+ - "--openai-api-key=my_local_key"
56
+ - "--openai-base-url=https://127.0.0.1:11556/v1"
57
+ vm: agent-ubuntu # optional: one VM for this agent
58
+ vms: agent-ubuntu # optional: multiple VMs (also accepts [agent-ubuntu, another-vm]); merged with vm
59
+ # if vm and vms are empty or omitted, the agent is treated as assigned to all VMs from the vms section
60
+ aider:
61
+ type: aider
62
+ forgecode:
63
+ type: forgecode
@@ -0,0 +1,279 @@
1
+ Metadata-Version: 2.4
2
+ Name: agsekit
3
+ Version: 0.0.1
4
+ Summary: Agent Safety Kit command-line utilities
5
+ Author-email: Mihanentalpo <mihanentalpo@yandex.ru>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2025 Mihanentalpo
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Requires-Python: >=3.9
29
+ Description-Content-Type: text/markdown
30
+ License-File: LICENSE
31
+ Requires-Dist: ansible-core<2.19,>=2.16; python_version >= "3.10"
32
+ Requires-Dist: ansible-core<2.16,>=2.15; python_version < "3.10"
33
+ Requires-Dist: click<9,>=8.1
34
+ Requires-Dist: pexpect<5,>=4.9; os_name != "nt"
35
+ Requires-Dist: pydantic<3,>=2.7
36
+ Requires-Dist: portalocker<3,>=2.8
37
+ Requires-Dist: psutil<8,>=5.9
38
+ Requires-Dist: PyYAML<7,>=6.0
39
+ Requires-Dist: questionary<3,>=2.0
40
+ Requires-Dist: rich<14,>=13.7
41
+ Requires-Dist: ruamel.yaml<0.19,>=0.18
42
+ Requires-Dist: tomli>=2.0.1; python_version < "3.11"
43
+ Dynamic: license-file
44
+
45
+ # Agent Safety Kit
46
+
47
+ Want to run Claude Code, Codex, and other AI agents for development, but do not want them to delete your project, break your system, or hand your secrets to third parties?
48
+
49
+ This project gives you a convenient toolkit for running AI agents in a virtual machine almost the same way as "normally".
50
+
51
+ [README на русском](README-ru.md) | [Documentation index](docs/README.md) | [Русская документация](docs-ru/README.md) | [Project philosophy](docs/philosophy.md)
52
+
53
+ ## Why?
54
+
55
+ ![Agent mistake](docs/assets/agent-mistake.png)
56
+
57
+ The way autonomous AI agents work feels like magic. But then an agent goes "whoosh" and, as if by magic, the project disappears, the local environment is damaged, the database is wiped, private keys are compromised, and in general everything the agent can reach is at risk.
58
+
59
+ On the websites of both giant corporations and small teams building their own AI agents, installation often looks like `curl | bash`, `npm i -g ...`, and then `<agent_name>`.
60
+
61
+ In practice, this is a two-command way to allow arbitrary code execution on your working machine, while trusting security to people who, if something happens, will not be responsible for the consequences.
62
+
63
+ A few stories for illustration:
64
+
65
+ - [Research: AI agents can swallow a prompt injection and start carrying out someone else's will on your PC](https://arxiv.org/abs/2507.20526)
66
+ - [Claude Code bypasses its own protections and escapes the sandbox](https://ona.com/stories/how-claude-code-escapes-its-own-denylist-and-sandbox)
67
+ - [Qwen Coder breaks working builds](https://github.com/QwenLM/qwen-code/issues/354)
68
+ - [Codex keeps deleting files that are not added to git and are unrelated to the task](https://github.com/openai/codex/issues/4969)
69
+ - [Google Antigravity just deleted the contents of my whole drive](https://www.reddit.com/r/google_antigravity/comments/1p82or6/google_antigravity_just_deleted_the_contents_of/)
70
+ - [Claude Code deleted my entire working environment](https://www.reddit.com/r/ClaudeAI/comments/1m299f5/claude_code_deleted_my_entire_workspace_heres_the/)
71
+ - [I asked Claude Code to fix all bugs, and it just deleted my project](https://levelup.gitconnected.com/i-asked-claude-code-to-fix-all-bugs-and-it-deleted-the-whole-repo-e7f24f5390c5)
72
+ - [Claude Code deleted 25,000 documents from a third-party project while I was distracted](https://www.reddit.com/r/ClaudeAI/comments/1rshuz9/an_ai_agent_deleted_25000_documents_from_the/)
73
+
74
+ Other stories can be found in unlimited quantities on Google with the query: [coding agent deleted|removed|compromised|destroyed](https://www.google.com/search?q=coding+agent+deleted%7Cremoved%7Ccompromised%7Cdestroyed)
75
+
76
+ Everywhere people write: "just make backups", "just use git".
77
+
78
+ But that is not enough:
79
+
80
+ - agents destroy unstaged changes, and git will not help here;
81
+ - agents leave the project folder and their own sandbox and can damage files in your OS;
82
+ - agents can read outside the project folder and potentially read and send your private SSH keys or other secrets to an attacker after eating a prompt injection somewhere on a documentation page, in an issue tracker, or in an infected project;
83
+ - agents can use vulnerabilities in the kernel or local environment if you give them too many rights, tools, and trust;
84
+ - even with the best intentions, an agent can hallucinate nonexistent information, delete a "broken" project instead of fixing it, bring down a DB and wipe its backups, simply because it confidently chose the wrong action.
85
+
86
+ Modern coding agents already show a very high level on tasks related to finding and exploiting vulnerabilities. If you give such an agent broad access, the blast radius can easily go far beyond one repository.
87
+
88
+ Another idea is to run agents in docker/podman/lxc. It is quite reasonable, but it also has downsides:
89
+
90
+ - a container is different from a full PC that agents are designed for, which creates a number of limits. The simplest one is that safely running nested Docker inside Docker is difficult, and this matters in modern development.
91
+ - a container provides much weaker isolation from a malicious agent that has eaten prompt injections somewhere. Escaping a container via kernel vulnerabilities is easier than escaping a VM.
92
+
93
+ ## Quick Start
94
+
95
+ Working with an agent through agsekit is not much harder than working with a "bare" agent.
96
+
97
+ Of course, you need to do the initial setup, but it is much simpler than doing everything manually: installing a VM, connecting to it, installing software, and so on.
98
+
99
+ ### 1. Installation
100
+
101
+ You need **Python 3.9+.** The install scripts can offer to install it automatically if it is missing.
102
+
103
+ * Deb/Arch Linux and macOS with Homebrew are fully supported.
104
+ * Native Windows PowerShell is also supported
105
+ * WSL is not supported.
106
+
107
+ If you are lazy and fearless on Linux or macOS:
108
+
109
+ ```shell
110
+ curl -fsSL https://agsekit.org/install.sh | sh
111
+ ```
112
+
113
+ On Windows, run in PowerShell:
114
+
115
+ ```powershell
116
+ irm https://agsekit.org/install.ps1 | iex
117
+ ```
118
+
119
+ If you want to do everything yourself, or the "lazy" way did not work:
120
+
121
+ [Detailed installation guide](./docs/install.md)
122
+
123
+ ### 2. Create a Configuration
124
+
125
+ Through the interactive setup wizard:
126
+
127
+ ```shell
128
+ agsekit config-gen
129
+ ```
130
+
131
+ The wizard starts with the first VM, then offers agents, mounts, and optional global overrides.
132
+
133
+ If you want, you can copy the config template and edit it manually:
134
+
135
+ ```shell
136
+ agsekit config-example
137
+ nano ~/.config/agsekit/config.yaml
138
+ ```
139
+
140
+ [Detailed configuration guide](./docs/configuration.md)
141
+
142
+ ### 3. Initial Setup
143
+
144
+ ```shell
145
+ agsekit up
146
+ ```
147
+
148
+ This command installs Multipass, creates a virtual machine, installs agents, and installs software packages.
149
+
150
+ It may take some time.
151
+
152
+ ### 4. Add a Project Folder
153
+
154
+ ```shell
155
+ agsekit addmount ~/project/my-project
156
+ ```
157
+
158
+ An interactive mode will start and ask a number of questions. You can answer them by simply pressing ENTER.
159
+
160
+ ### 5. Run the Agent in the Project Folder
161
+
162
+ Assume you configured an agent named claude:
163
+
164
+ ```shell
165
+ cd ~/project/my-project
166
+ agsekit run claude
167
+ ```
168
+
169
+ That is it, you can use it.
170
+
171
+ More details: [Getting started](docs/getting-started.md)
172
+
173
+ ## How It Works
174
+
175
+ * agsekit is a CLI tool for simplifying work with agents in virtual machines
176
+ * the simple and convenient Multipass is used as the virtual machine engine
177
+ * the agent runs inside a Multipass VM (with Ubuntu installed in it)
178
+ * to work with the project, its folder is mounted into the VM
179
+ * so the agent cannot cause damage by wiping the mounted project folder, cyclic backup of the project folder on the main machine runs at the same time as the agent
180
+ * if the agent needs internet access through an http-proxy or socks-proxy, there is support for http-proxy through proxify and running through proxychains4
181
+ * ports can be conveniently forwarded into and out of the VM (based on SSH tunnels)
182
+ * you can have several VMs for different purposes, for example one for personal projects and another for work under NDA
183
+ * there is a set of basic supported agents, and also different software bundles installed into the VM with one command
184
+
185
+ **The basic workflow is this:**
186
+
187
+ - The host machine stores the real source code and launches an Ubuntu VM through Multipass.
188
+ - The project folder is mounted from the host into the selected VM.
189
+ - The agent binary runs inside the VM, not on the host.
190
+ - `agsekit` runs repeated incremental backups of the mounted folder while the agent session is running.
191
+ - For restricted networks, `proxychains`, `http_proxy`, and `portforward` are available.
192
+
193
+ Details: [docs/architecture.md](docs/architecture.md)
194
+
195
+ ## Features
196
+
197
+ - Run agents inside a Multipass VM, not directly on the host.
198
+ - Declarative YAML for VMs, mounts, network settings, and agent defaults.
199
+ - Automatic incremental backups with hardlink snapshots.
200
+ - Several virtual machines with binding of specific agents to specific VMs, for example to separate NDA projects, work, and hobbies across different environments and models.
201
+ - Installation of supported agent CLIs into target VMs through `install-agents`.
202
+ - `proxychains` support for installation and runtime.
203
+ - VM-level and agent-level `http_proxy` support.
204
+ - Persistent SSH port forwarding through `agsekit portforward`.
205
+ - Both interactive and non-interactive CLI scenarios.
206
+ - Automatic preparation of Linux and macOS hosts.
207
+
208
+ ## Documentation
209
+
210
+ - [Table of contents](docs/README.md)
211
+ - [Getting started](docs/getting-started.md)
212
+ - [Configuration](docs/configuration.md)
213
+ - [Command reference](docs/commands/README.md)
214
+ - [Supported agents](docs/agents.md)
215
+ - [Architecture](docs/architecture.md)
216
+ - [Networking and proxies](docs/networking.md)
217
+ - [Backups](docs/backups.md)
218
+ - [Troubleshooting](docs/troubleshooting.md)
219
+ - [Practical how-to](docs/how-to.md)
220
+ - [Known issues and limitations](docs/known-issues.md)
221
+
222
+ ## Supported Agents
223
+
224
+ - [aider](https://aider.chat/)
225
+ - [Qwen Code](https://qwenlm.github.io/qwen-code-docs/en/)
226
+ - [ForgeCode](https://forgecode.dev/)
227
+ - [Codex](https://openai.com/codex/)
228
+ - [OpenCode](https://opencode.ai/)
229
+ - [Claude Code](https://docs.claude.com/en/docs/claude-code/overview)
230
+ - [Cline](https://cline.bot/)
231
+ - `codex-glibc` - a [Codex](https://openai.com/codex/) variant built inside the VM
232
+ - `codex-glibc-prebuilt` - a [Codex](https://openai.com/codex/) variant installed from a ready prebuilt release
233
+
234
+ Details: [docs/agents.md](docs/agents.md)
235
+
236
+ ## Security Model and Limitations
237
+
238
+ What the tool does:
239
+
240
+ - isolates agent execution inside a VM;
241
+ - keeps the host project in mounted storage;
242
+ - creates rollback-friendly backups around agent runs.
243
+
244
+ More details: [docs/philosophy.md](docs/philosophy.md)
245
+
246
+ ## Platform Support
247
+
248
+ - Linux host: supported, but WSL is not supported
249
+ - macOS host: supported
250
+ - Windows host: supported
251
+
252
+ ## FAQ
253
+
254
+ ### Who is this for?
255
+
256
+ For developers who want to use coding agents but do not want to break their system.
257
+
258
+ ### Do I need to use git with agsekit?
259
+
260
+ Yes. `agsekit` complements git, it does not replace it.
261
+
262
+ ### Why Multipass, not Docker?
263
+
264
+ 1. Security: a VM gives much better isolation of the agent from your system
265
+ 2. Environment reality: in a VM the agent can install any software, run Docker containers, and do almost everything that can be done on a real machine. In Docker this is impossible or much more complicated
266
+
267
+ ## Contributing and License
268
+
269
+ - If you want to contribute:
270
+ - Fork repo
271
+ - `git clone ...`
272
+ - `pip install -e .`
273
+ - `git checkout -b new-shiny-feature`
274
+ - `vim ...`
275
+ - `git add . && git commit -m "Implemented new feature" && git push`
276
+ - create pull request
277
+ - If there are problems, write Issues
278
+
279
+ - License: [MIT](LICENSE)
@@ -0,0 +1,117 @@
1
+ agsekit-0.0.1.data/data/share/agsekit/config-example.yaml,sha256=ThlmF4VMa9j5BJecAyYTPj5-9JFcKLIQKUZMP36MrxU,4293
2
+ agsekit-0.0.1.dist-info/licenses/LICENSE,sha256=pnZSO0USEZMgsTY7AT3cpFEGf6oXuttYjaqRDCbFfgE,1069
3
+ agsekit_cli/__init__.py,sha256=tVGnz1QCZoa0q8qeM8xSRl65lKdxFqZ4LDtl83OQyCk,47
4
+ agsekit_cli/agents.py,sha256=cr-Wy3SmBcKpGLILU3T62cjUSQnj27gG6z2sU_VgapQ,12604
5
+ agsekit_cli/ansible_runners.py,sha256=d11coWNqDzGxgai4G7gThGCar5fdDUHjWlyV9txCXww,2146
6
+ agsekit_cli/ansible_utils.py,sha256=6OCijr4R0GcY2H6KrVwL4S6HYmDKaqg24hbxmMi1-OY,10182
7
+ agsekit_cli/backup.py,sha256=pHDXnouv8yZd7CG-3ZMx_yrtGdlbKW2Vj_Pm1ZRDjPc,20642
8
+ agsekit_cli/cli.py,sha256=ksiFRqE2nSrbKU5Ldmvn8-4qj6rvsxe9-H6c5JhFwCw,6871
9
+ agsekit_cli/cli_entry.py,sha256=VjsgfjoBiZ-rtwE3AlIyQYkwdS6HkFIU5mImiwJtBd8,1067
10
+ agsekit_cli/config.py,sha256=MI8ZgpbX-t_CYLcFKUIBHThwggLAfUat238YyDBSzqA,35825
11
+ agsekit_cli/daemon_backends.py,sha256=O6vto6ubfJGRRnwT91XaBxAKVTx5pkcOatnJdNXkTjk,14960
12
+ agsekit_cli/debug.py,sha256=ToVHSnHqkwWmX9C-jn3Egc5MQlYVepKLyOh5AGz93-w,2216
13
+ agsekit_cli/host_tools.py,sha256=XmiLPKvkv7Wk20C7069Kz6mhWtzjHD5nP_XdS9ZT3MQ,4970
14
+ agsekit_cli/i18n.py,sha256=y1jOnsRwkKBz79ZVL5tf0Kk4TaPUQESo9nIglkVpMvU,2011
15
+ agsekit_cli/interactive.py,sha256=qhXJT0JKwfoxcFaw6EXm9wsQeIwMS66Aa1nEmgXImzY,23065
16
+ agsekit_cli/mounts.py,sha256=qC5qtYFo7K1jAYiyQL-Wy16Yhqz4v38RPwMxFIDG0AU,9110
17
+ agsekit_cli/prebuilt.py,sha256=YQx2ul-lklniXnsSDzdluFx9jZW9gAYDEnmeV-vTd7k,8430
18
+ agsekit_cli/prepare_strategies.py,sha256=C9ueUH7yxw3zQCBNPVJUJkhsaea9a-0PX6PrCevffiY,15915
19
+ agsekit_cli/progress.py,sha256=B5MmjWDAWNdsk-xN1DRkOU5jyM_lUCEe8LOb-HBn74w,6856
20
+ agsekit_cli/provision_handlers.py,sha256=JSdwSJLLmHLhVF6lWpczxuUFZa3fP8X6PJaT4ySbfHc,15165
21
+ agsekit_cli/run_agent.sh,sha256=718A9AL3DTdPU1-x_CAnkgoPEsjXjQG9-dwahmWV8gE,4001
22
+ agsekit_cli/run_with_http_proxy.sh,sha256=aZvIADfsguIe4L76Ro9OcV_D7RcFlQhXWvYvYg3WBEc,6968
23
+ agsekit_cli/run_with_proxychains.sh,sha256=Fqg_S2_byAglCD-2m1vDndAMm5WAtHYeDGQ0GigdMf8,759
24
+ agsekit_cli/state.py,sha256=RmenD7ybPrKBCWB2FD4I8bLi3gtOe-nu27pq2WAFouQ,7047
25
+ agsekit_cli/systemd_backend.py,sha256=bXDWuoXcp7tGmrnDBHcbaiowPCZfNpECs69a8cjp5CA,11043
26
+ agsekit_cli/tui_prompts.py,sha256=wVv3luM4193NODt8l2_-po_VnjJ10b8eN43zKWXd7i0,4273
27
+ agsekit_cli/versioning.py,sha256=AzbdlBszzV2yeXo8-2HHORQtmvfh3pX6vPCxQ7N2PQU,4379
28
+ agsekit_cli/vm.py,sha256=44VnZ-KGhMpk0aewRZBvSesTGe70_pwsRMTFLkzgAv8,23308
29
+ agsekit_cli/vm_bundle_definitions.py,sha256=fZow_oPEHoKgHNGdlVC0zLvNuV-WoRtecQd4MZAN2Vs,1799
30
+ agsekit_cli/vm_bundles.py,sha256=ieh-obA0odWUsiY2DNV-eVxlEEeC76qinobhUPjcMSc,2778
31
+ agsekit_cli/vm_local_control_node.py,sha256=7_UIf-VExWuoFFhMYmWMrKARh49F40rD2bVZjZsNiKc,9439
32
+ agsekit_cli/vm_prepare.py,sha256=an6PWeTwzFuOtE0VbeGJgBEModKb5L1up_xQg-hA7Ek,13001
33
+ agsekit_cli/vm_ssh_bootstrap.py,sha256=zzHlrh__GFoV5dtpVhQVD1ucDrhFMYDJ1LA6cjd_Alo,4320
34
+ agsekit_cli/agent_scripts/claude-code.sh,sha256=mG6KkWqZQ9L2TH0hPHPl6yFY8jjmLMz4iNcyHlhUdWY,325
35
+ agsekit_cli/agent_scripts/codex-glibc.sh,sha256=mcC5CECTB2sGfC8emaumeXMmdRO-38VZlXxg_stM_48,6364
36
+ agsekit_cli/agent_scripts/codex.sh,sha256=Q5HtN6HJzTutAQJAEJkXHOBJUvQ-5kQCYS6IL2i0lvQ,2967
37
+ agsekit_cli/agent_scripts/proxychains_common.sh,sha256=FCwLrP0myL2RchaVMLGemLGrRC5t12umGd7vx6D7aS0,2638
38
+ agsekit_cli/agent_scripts/qwen.sh,sha256=IM_TGP6gTQn6Jb8j6h39zvSkuuQ-tMtG96zdguSPUPo,2961
39
+ agsekit_cli/agents_modules/__init__.py,sha256=eeivT3_zHto2CkFOHd5fPpV2f4aDo8dC7R5lsqn9LFo,1442
40
+ agsekit_cli/agents_modules/aider.py,sha256=tkYFPUF-HdAFSkN3Idbn_-PzLGfSJhbs7BCZNtEa5gg,112
41
+ agsekit_cli/agents_modules/base.py,sha256=zJ_-tZ8kTampvOvhLHxsOksYJaP2GqAegG8P8QUESV4,2169
42
+ agsekit_cli/agents_modules/claude.py,sha256=F6HqXpY0dbrEu8cz5zv9v04zS1LjQ6Uty3gBtUQVb4M,115
43
+ agsekit_cli/agents_modules/cline.py,sha256=wqB6hk-nQwHcIcaDnE5RixKYywUqZP-8EwHxrdoXuIQ,134
44
+ agsekit_cli/agents_modules/codex.py,sha256=BeZP68bhlBkWBNdbqRlT-sqh9pO2593K2DHR5P93ips,134
45
+ agsekit_cli/agents_modules/codex_glibc.py,sha256=3MP5-amI5qj8cUctfWbKDE0R7e_7fXzadG6pWVhqJiM,129
46
+ agsekit_cli/agents_modules/codex_glibc_prebuilt.py,sha256=xuwAFSuZ926Whn8MuDTimk9fLSF1gPrSQiJPpv21bwU,155
47
+ agsekit_cli/agents_modules/forgecode.py,sha256=6349dSjevwxAEmfiAGVg33lMFHprzHMIvY445LT5mWc,282
48
+ agsekit_cli/agents_modules/opencode.py,sha256=Ff2RQdBrZQAPRL2gY69XnY3_80v8EGI1t6yfQ3yS_N0,143
49
+ agsekit_cli/agents_modules/qwen.py,sha256=rhxvUN3kLWrioWGuj-yx1Krc4VcNv4WKZGOTWqymI5w,131
50
+ agsekit_cli/ansible/vm_packages.yml,sha256=SzrUgvkUigh8cLOexYAUDhtDmN0WEH4F-6Z0WnlsCO8,1838
51
+ agsekit_cli/ansible/vm_ssh.yml,sha256=IiThAimZvazVsIy6oH04_LEh0F0_0NaOr9sJzMt-2ng,2752
52
+ agsekit_cli/ansible/agents/aider.yml,sha256=EeYV8byKzBTaTQavNBUgjXbg5id_JII_-lOB7SXBspo,2145
53
+ agsekit_cli/ansible/agents/claude.yml,sha256=ZtpFllTpRsJItwoNCkQVLRMuAFmH80F0ySxJ_1nyBT0,4122
54
+ agsekit_cli/ansible/agents/cline.yml,sha256=3VY-6kuXcjhKXMMH5b3VjudsB-IhpUzQdrZdmCkrwN4,4446
55
+ agsekit_cli/ansible/agents/codex-glibc-prebuilt.yml,sha256=fQMcgGJhiBNkJrS-S181Dp8qRgfC4K7NMeriGbvwgps,5103
56
+ agsekit_cli/ansible/agents/codex-glibc.yml,sha256=D268NDyg9RZmJCSKGhe9C88es8Xsz1eBU8SJSAR_8gs,9551
57
+ agsekit_cli/ansible/agents/codex.yml,sha256=Cf1Dl3KRxK-KQT7w7_uZXio9zsNPq6TPnSBnj7An5Xg,4628
58
+ agsekit_cli/ansible/agents/codex_logrotate.yml,sha256=PtqJHWagAW0tCOZ3tCouBBGGn64lawuOFipZzrcssgo,609
59
+ agsekit_cli/ansible/agents/forgecode.yml,sha256=7noPCBRvB9pn6K5wdya2T0O2rL3RjyNtBIHJT1T7Y7M,2221
60
+ agsekit_cli/ansible/agents/opencode.yml,sha256=xaTgHjLHkQDpQX6EbU0yU22_ST_ax_-W-aPLjg-AY10,4691
61
+ agsekit_cli/ansible/agents/proxychains.yml,sha256=vvPjRf3TtL3yk0naDuXe_juID8DTf1P7L03UKC_Nmvc,1738
62
+ agsekit_cli/ansible/agents/qwen.yml,sha256=49wHuXaYrglPfBj72p_INTmmB01lAfV68sOAgO-vqU4,4480
63
+ agsekit_cli/ansible/bundles/docker.yml,sha256=Zf8GdTyUPMWeFR2de6SZOmeKwx9SwprVG25zBfE7xEo,2419
64
+ agsekit_cli/ansible/bundles/golang.yml,sha256=ZVhuJCVLH-7GDKLROQ_XIeFU3XdzSKFHBtaSoEjLvA0,762
65
+ agsekit_cli/ansible/bundles/nodejs.yml,sha256=-m5CdYmHxwuKCDZd0TIKJghqAsNHwZZM76DiVDyY57Q,1980
66
+ agsekit_cli/ansible/bundles/nvm.yml,sha256=c8TQO9i6Wd7x0dBg29ePMRwW3CAN21jbeRJAXDT4dR8,1593
67
+ agsekit_cli/ansible/bundles/pyenv.yml,sha256=hnlB9bLFZkHrEwVzYKRYDXcWHfdOBGTyLGQZcdkGwjM,2330
68
+ agsekit_cli/ansible/bundles/python.yml,sha256=i8alws2_RpjLksB5YUlYAJk60ZmuA7pWOYD87ncxaak,1513
69
+ agsekit_cli/ansible/bundles/rust.yml,sha256=gK1F6PzaavrphbQ3f12Qhhg_1k6adajCu8u0OLoQO28,1403
70
+ agsekit_cli/ansible/callback_plugins/agsekit_progress.py,sha256=J6CgPhR_DfPHAhqXpccxmoZPnhC4IMbEPWAK_LB2KB4,6672
71
+ agsekit_cli/ansible/callback_plugins/agsekit_rich.py,sha256=T3So96_Tub87umO5R1pXKekC_LLgNhDB3_CmjZxDq8Y,3912
72
+ agsekit_cli/ansible/connection_plugins/agsekit_multipass.py,sha256=EPS38MUCiZIVLlduarUdIH1sH-3uUL9e0QOPWJf78Bo,5724
73
+ agsekit_cli/commands/__init__.py,sha256=Q-l8Oe_WteKiyVPldFckpUNZqAsYPKal3IjpPsLpRq0,379
74
+ agsekit_cli/commands/addmount.py,sha256=Ikie0a1E-42hM1_mBDyf_toOk-ktR0XTeE9L0sPC2Bs,17128
75
+ agsekit_cli/commands/backup_clean.py,sha256=cTt94H6dVzJUJBoUAZeUQtOjGR_34QA7YFrXgqSyS3A,2251
76
+ agsekit_cli/commands/backup_once.py,sha256=nPpfj40Qwl6gb_Xm3vXJr6hDtbtkFhHa9GodSdpouxs,1224
77
+ agsekit_cli/commands/backup_repeated.py,sha256=taWUuVnCD9oBP6Orsu1XuImh30b8cBcpNnqBFdnxf9k,5740
78
+ agsekit_cli/commands/check_new_version.py,sha256=9DT-5IYtCsOzHVgrcpfxDy8y6tjSLo28AqaLVqW4esw,1633
79
+ agsekit_cli/commands/config_example.py,sha256=GZVFIachUVr3tzLRPqQqi6C8rbI0UVwWWdYt8WkcX3g,1436
80
+ agsekit_cli/commands/config_gen.py,sha256=1cstISFeWHiTfUC1h_7pSd70s5hwPG0y4edTl0DzKA4,18220
81
+ agsekit_cli/commands/create_vm.py,sha256=VT95sK0Fc-G8oLKJ7eLUc84gJobMQ_WqhDxlDPd15vw,7474
82
+ agsekit_cli/commands/daemon.py,sha256=0qFnIzgksr3aoSdmrY4qgH695IKuZyqqjN2jrKij8Qg,3939
83
+ agsekit_cli/commands/destroy_vm.py,sha256=3Si1GTg1n4Ucpvyv8ZHx_RORQ7waxW2hIkNR0DCHOuc,4417
84
+ agsekit_cli/commands/doctor.py,sha256=8h53qBHxUbNjgPxoYpzi4KicrS8S2nx2u0jfxWyb9e4,18862
85
+ agsekit_cli/commands/down.py,sha256=HRgKJeJNC8QlmUszTi-3ga4YJObCI-qLW4XY703LYBw,4781
86
+ agsekit_cli/commands/install_agents.py,sha256=263LmKe4pClrccr-M8kL75mcf_g_qfeq8laD4-BIVqM,15831
87
+ agsekit_cli/commands/list_bundles.py,sha256=ei-8CT1L2k_k_gL_xnExVInUxj5LosVy4hnCAAMKnF8,780
88
+ agsekit_cli/commands/mounts.py,sha256=c17ataPNiujcCJMLvc_SQjuj4WC3qGzCrXwsiTBPg_g,4399
89
+ agsekit_cli/commands/pip_upgrade.py,sha256=zA51oz5_qoV-TJMxOwbFaiDjInse7hLmOh9nBpM-mB0,4687
90
+ agsekit_cli/commands/portforward.py,sha256=eHxRKcpE06TUws0DdxmSc-aSgch1GIQg8a99t4YzqG0,10763
91
+ agsekit_cli/commands/prepare.py,sha256=oZVztQg2uSFPqIpN-ix2I0gbMDGQCZFazN9j6R7yFyE,2239
92
+ agsekit_cli/commands/removemount.py,sha256=UpizU4XJn9oB-VSaYdVrKCnfR37OSO4MyxScc6juyuc,6301
93
+ agsekit_cli/commands/restart_vm.py,sha256=9c6OpflylOElqeKLTdovdT5VOq6ss_ZuYanvcZMf_lk,2884
94
+ agsekit_cli/commands/run.py,sha256=epAsJOA8Gg-fxarX6RsveusjmrSrF88NbmZqE8Ok2_w,19129
95
+ agsekit_cli/commands/shell.py,sha256=eZFKYvw8O9hesdEi3pyd8BT3S7rFRHhYdM7-o2TkDms,2627
96
+ agsekit_cli/commands/ssh.py,sha256=3Nbk-u81PFwoSV92jZzc8GHbczKlp2faw6hQbxP2nFo,5087
97
+ agsekit_cli/commands/start_vm.py,sha256=gVaHZWY9XhYiH1xeJ02OksIJhwx3nV57ppd-GcOZmx0,3190
98
+ agsekit_cli/commands/status.py,sha256=YmUK3JSdL23BLqmKm2n6X6_CXTwnw8QN2llJFfAAiiw,21985
99
+ agsekit_cli/commands/stop.py,sha256=NnkOpYCW9oC3S3oMPDgz5DfsSTbPHsTRuxKxI2nn86w,5261
100
+ agsekit_cli/commands/systemd.py,sha256=Yaqzf3f14Wc3zM5rEcd0x2LtwQ_xgarRkYXnNft-pW8,4523
101
+ agsekit_cli/commands/up.py,sha256=RnoAprkxzsjO6496Gbm3hSrCe50rwkjZNWWZojVtVJI,4045
102
+ agsekit_cli/commands/version.py,sha256=8mUUosUxJnmjnDxyMYnM2mqNCoW49KflHtHvvNilUuE,569
103
+ agsekit_cli/locales/en.json,sha256=WZqLHHpsQ4K236YjaIptaAowxIbHGGcLphY3BQlw9jc,67743
104
+ agsekit_cli/locales/ru.json,sha256=g6fz7Nv-yrSmYzhziHkMRVmg-YLRv6TVa3g29c82gHI,93625
105
+ agsekit_cli/systemd/agsekit-portforward.service,sha256=87DYGmblW0SlumZA1s0g5RPeFZe-oKDwVgVnjJ4uof8,300
106
+ agsekit_cli/vm_installers/docker.sh,sha256=VBMmDClo4w9Q5d_fcqaX3sOwi3JwbSuZ-pOgw0Go43o,1109
107
+ agsekit_cli/vm_installers/golang.sh,sha256=X9OyqoEsSCQvzYuOUB0KN4RnQT7WZGpGgHwGU1wv7ao,335
108
+ agsekit_cli/vm_installers/nodejs.sh,sha256=Kw7Ffkgf-9Je_UtmRulzgsCtgLkDwmpU91KZElQsbAo,940
109
+ agsekit_cli/vm_installers/nvm.sh,sha256=mT-olrpwxkFQ1wQF3FZ1Q77ABHwOH1WSb9q-mNBKyWk,918
110
+ agsekit_cli/vm_installers/pyenv.sh,sha256=GvSqzGysknH6K0Miht1dMD2Ua75_BJ83ymxDNlCad9s,1472
111
+ agsekit_cli/vm_installers/python.sh,sha256=gjiYwrHUv0vl-Ywee4ttPzuBz1CMXICMIGbci69Uns4,721
112
+ agsekit_cli/vm_installers/rust.sh,sha256=t58fitItyVtCJIaukVkUX5Jpb--tSxOfw1TT9FgsWpA,819
113
+ agsekit-0.0.1.dist-info/METADATA,sha256=oyI3OX65wmEEisIM2pdBCgi4zqOvC2HzJzEEINmxhPA,12580
114
+ agsekit-0.0.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
115
+ agsekit-0.0.1.dist-info/entry_points.txt,sha256=7DEDCsqtJhUtqqYhY64NhimWs-5paT-i28GRbYXUGJc,49
116
+ agsekit-0.0.1.dist-info/top_level.txt,sha256=djDyVGoLJs_ypRel9LAc3wHcB-7oJTrt7cOI12CcXA8,12
117
+ agsekit-0.0.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ agsekit = agsekit_cli.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Mihanentalpo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ agsekit_cli
@@ -0,0 +1 @@
1
+ """Agent Safety Kit command-line utilities."""
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ # shellcheck disable=SC1091
6
+ . "$SCRIPT_DIR/proxychains_common.sh"
7
+
8
+ PROXYCHAINS_PROXY="${AGSEKIT_PROXYCHAINS_PROXY:-}"
9
+
10
+ echo "Installing Claude Code agent..."
11
+
12
+ run_with_proxychains curl -fsSL https://claude.ai/install.sh | bash