windows-development-sandbox 0.0.0-stage → 1.0.5

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 (231) hide show
  1. package/.sandbox-config.example.json +14 -0
  2. package/README.md +78 -2
  3. package/config.example.json +332 -0
  4. package/dist/api.d.ts +31 -0
  5. package/dist/api.js +30 -0
  6. package/dist/bin/agent-sandbox.d.ts +2 -0
  7. package/dist/bin/agent-sandbox.js +3 -0
  8. package/dist/bin/claude-host.d.ts +2 -0
  9. package/dist/bin/claude-host.js +5 -0
  10. package/dist/bin/claude-sbx.d.ts +2 -0
  11. package/dist/bin/claude-sbx.js +3 -0
  12. package/dist/bin/codex-sbx.d.ts +2 -0
  13. package/dist/bin/codex-sbx.js +3 -0
  14. package/dist/bin/gemini-sbx.d.ts +2 -0
  15. package/dist/bin/gemini-sbx.js +3 -0
  16. package/dist/bin/sandbox.d.ts +2 -0
  17. package/dist/bin/sandbox.js +4 -0
  18. package/dist/bin/sbx-hide.d.ts +2 -0
  19. package/dist/bin/sbx-hide.js +3 -0
  20. package/dist/bin/sbx-show.d.ts +2 -0
  21. package/dist/bin/sbx-show.js +3 -0
  22. package/dist/cli/args.d.ts +32 -0
  23. package/dist/cli/args.js +111 -0
  24. package/dist/cli/commands/accounts.d.ts +2 -0
  25. package/dist/cli/commands/accounts.js +52 -0
  26. package/dist/cli/commands/context.d.ts +21 -0
  27. package/dist/cli/commands/context.js +54 -0
  28. package/dist/cli/commands/data.d.ts +46 -0
  29. package/dist/cli/commands/data.js +249 -0
  30. package/dist/cli/commands/index.d.ts +8 -0
  31. package/dist/cli/commands/index.js +8 -0
  32. package/dist/cli/commands/launch.d.ts +5 -0
  33. package/dist/cli/commands/launch.js +152 -0
  34. package/dist/cli/commands/maintenance.d.ts +8 -0
  35. package/dist/cli/commands/maintenance.js +125 -0
  36. package/dist/cli/commands/repair.d.ts +59 -0
  37. package/dist/cli/commands/repair.js +332 -0
  38. package/dist/cli/commands/sessions.d.ts +11 -0
  39. package/dist/cli/commands/sessions.js +113 -0
  40. package/dist/cli/commands/setup.d.ts +45 -0
  41. package/dist/cli/commands/setup.js +152 -0
  42. package/dist/cli/index.d.ts +14 -0
  43. package/dist/cli/index.js +96 -0
  44. package/dist/cli/manifest.d.ts +95 -0
  45. package/dist/cli/manifest.js +87 -0
  46. package/dist/cli/menu.d.ts +22 -0
  47. package/dist/cli/menu.js +187 -0
  48. package/dist/cli/settings.d.ts +11 -0
  49. package/dist/cli/settings.js +156 -0
  50. package/dist/core/config.d.ts +17 -0
  51. package/dist/core/config.js +103 -0
  52. package/dist/core/detect-databases.d.ts +15 -0
  53. package/dist/core/detect-databases.js +147 -0
  54. package/dist/core/detect-pwsh.d.ts +18 -0
  55. package/dist/core/detect-pwsh.js +111 -0
  56. package/dist/core/detect-toolchains.d.ts +30 -0
  57. package/dist/core/detect-toolchains.js +58 -0
  58. package/dist/core/local-config.d.ts +12 -0
  59. package/dist/core/local-config.js +64 -0
  60. package/dist/core/schema.d.ts +604 -0
  61. package/dist/core/schema.js +264 -0
  62. package/dist/core/types.d.ts +162 -0
  63. package/dist/core/types.js +1 -0
  64. package/dist/core/util.d.ts +53 -0
  65. package/dist/core/util.js +145 -0
  66. package/dist/core/workspace.d.ts +23 -0
  67. package/dist/core/workspace.js +162 -0
  68. package/dist/guest/daemon.d.ts +1 -0
  69. package/dist/guest/daemon.js +186 -0
  70. package/dist/guest/db.d.ts +1 -0
  71. package/dist/guest/db.js +60 -0
  72. package/dist/guest/env.d.ts +49 -0
  73. package/dist/guest/env.js +99 -0
  74. package/dist/guest/gitguard.d.ts +7 -0
  75. package/dist/guest/gitguard.js +60 -0
  76. package/dist/guest/gitrules.d.ts +2 -0
  77. package/dist/guest/gitrules.js +11 -0
  78. package/dist/guest/guide.d.ts +12 -0
  79. package/dist/guest/guide.js +68 -0
  80. package/dist/guest/main.d.ts +1 -0
  81. package/dist/guest/main.js +120 -0
  82. package/dist/guest/ptyhost.d.ts +40 -0
  83. package/dist/guest/ptyhost.js +94 -0
  84. package/dist/guest/setup/agents.d.ts +8 -0
  85. package/dist/guest/setup/agents.js +73 -0
  86. package/dist/guest/setup/claude.d.ts +21 -0
  87. package/dist/guest/setup/claude.js +138 -0
  88. package/dist/guest/setup/environment.d.ts +6 -0
  89. package/dist/guest/setup/environment.js +65 -0
  90. package/dist/guest/setup/hooks.d.ts +1 -0
  91. package/dist/guest/setup/hooks.js +36 -0
  92. package/dist/guest/setup/network.d.ts +10 -0
  93. package/dist/guest/setup/network.js +99 -0
  94. package/dist/guest/setup/policy.d.ts +3 -0
  95. package/dist/guest/setup/policy.js +18 -0
  96. package/dist/guest/setup/user.d.ts +7 -0
  97. package/dist/guest/setup/user.js +47 -0
  98. package/dist/guest/toolchains/binstall.d.ts +7 -0
  99. package/dist/guest/toolchains/binstall.js +55 -0
  100. package/dist/guest/toolchains/catalogue.d.ts +51 -0
  101. package/dist/guest/toolchains/catalogue.js +31 -0
  102. package/dist/guest/toolchains/cli.d.ts +10 -0
  103. package/dist/guest/toolchains/cli.js +64 -0
  104. package/dist/guest/toolchains/common.d.ts +37 -0
  105. package/dist/guest/toolchains/common.js +124 -0
  106. package/dist/guest/toolchains/databases.d.ts +7 -0
  107. package/dist/guest/toolchains/databases.js +226 -0
  108. package/dist/guest/toolchains/git.d.ts +3 -0
  109. package/dist/guest/toolchains/git.js +112 -0
  110. package/dist/guest/toolchains/go.d.ts +3 -0
  111. package/dist/guest/toolchains/go.js +33 -0
  112. package/dist/guest/toolchains/index.d.ts +13 -0
  113. package/dist/guest/toolchains/index.js +122 -0
  114. package/dist/guest/toolchains/java.d.ts +8 -0
  115. package/dist/guest/toolchains/java.js +96 -0
  116. package/dist/guest/toolchains/managers.d.ts +16 -0
  117. package/dist/guest/toolchains/managers.js +82 -0
  118. package/dist/guest/toolchains/msvc.d.ts +10 -0
  119. package/dist/guest/toolchains/msvc.js +216 -0
  120. package/dist/guest/toolchains/native.d.ts +12 -0
  121. package/dist/guest/toolchains/native.js +220 -0
  122. package/dist/guest/toolchains/node.d.ts +3 -0
  123. package/dist/guest/toolchains/node.js +132 -0
  124. package/dist/guest/toolchains/pwsh.d.ts +4 -0
  125. package/dist/guest/toolchains/pwsh.js +14 -0
  126. package/dist/guest/toolchains/python.d.ts +3 -0
  127. package/dist/guest/toolchains/python.js +47 -0
  128. package/dist/guest/toolchains/runtimes.d.ts +17 -0
  129. package/dist/guest/toolchains/runtimes.js +40 -0
  130. package/dist/guest/toolchains/scripting.d.ts +10 -0
  131. package/dist/guest/toolchains/scripting.js +137 -0
  132. package/dist/guest/toolchains/versions.d.ts +47 -0
  133. package/dist/guest/toolchains/versions.js +77 -0
  134. package/dist/guest/toolchains/vscode.d.ts +2 -0
  135. package/dist/guest/toolchains/vscode.js +53 -0
  136. package/dist/guest/view.d.ts +1 -0
  137. package/dist/guest/view.js +22 -0
  138. package/dist/host/accounts.d.ts +32 -0
  139. package/dist/host/accounts.js +119 -0
  140. package/dist/host/channel.d.ts +37 -0
  141. package/dist/host/channel.js +180 -0
  142. package/dist/host/claude-profile.d.ts +15 -0
  143. package/dist/host/claude-profile.js +103 -0
  144. package/dist/host/cleanup.d.ts +23 -0
  145. package/dist/host/cleanup.js +66 -0
  146. package/dist/host/generate.d.ts +15 -0
  147. package/dist/host/generate.js +185 -0
  148. package/dist/host/personalize.d.ts +10 -0
  149. package/dist/host/personalize.js +97 -0
  150. package/dist/host/platform.d.ts +17 -0
  151. package/dist/host/platform.js +114 -0
  152. package/dist/host/project-scan.d.ts +23 -0
  153. package/dist/host/project-scan.js +173 -0
  154. package/dist/host/repo-guard.d.ts +23 -0
  155. package/dist/host/repo-guard.js +128 -0
  156. package/dist/host/secrets.d.ts +14 -0
  157. package/dist/host/secrets.js +133 -0
  158. package/dist/host/terminal.d.ts +32 -0
  159. package/dist/host/terminal.js +127 -0
  160. package/dist/host/window.d.ts +4 -0
  161. package/dist/host/window.js +68 -0
  162. package/dist/runtime/daemon.js +20291 -0
  163. package/dist/runtime/db.js +20423 -0
  164. package/dist/runtime/gitguard.js +84 -0
  165. package/dist/runtime/main.js +22398 -0
  166. package/dist/runtime/view.js +19966 -0
  167. package/dist/selftest/cli.test.d.ts +2 -0
  168. package/dist/selftest/cli.test.js +30 -0
  169. package/dist/selftest/config.test.d.ts +3 -0
  170. package/dist/selftest/config.test.js +74 -0
  171. package/dist/selftest/data.test.d.ts +2 -0
  172. package/dist/selftest/data.test.js +73 -0
  173. package/dist/selftest/detect.test.d.ts +2 -0
  174. package/dist/selftest/detect.test.js +42 -0
  175. package/dist/selftest/fixtures.d.ts +232 -0
  176. package/dist/selftest/fixtures.js +63 -0
  177. package/dist/selftest/guest.test.d.ts +3 -0
  178. package/dist/selftest/guest.test.js +61 -0
  179. package/dist/selftest/harness.d.ts +14 -0
  180. package/dist/selftest/harness.js +36 -0
  181. package/dist/selftest/helpers.test.d.ts +2 -0
  182. package/dist/selftest/helpers.test.js +125 -0
  183. package/dist/selftest/host.test.d.ts +2 -0
  184. package/dist/selftest/host.test.js +71 -0
  185. package/dist/selftest/index.d.ts +1 -0
  186. package/dist/selftest/index.js +56 -0
  187. package/dist/selftest/live.test.d.ts +7 -0
  188. package/dist/selftest/live.test.js +127 -0
  189. package/dist/selftest/mirror.test.d.ts +3 -0
  190. package/dist/selftest/mirror.test.js +74 -0
  191. package/dist/selftest/security.test.d.ts +3 -0
  192. package/dist/selftest/security.test.js +143 -0
  193. package/dist/selftest/setup.test.d.ts +2 -0
  194. package/dist/selftest/setup.test.js +23 -0
  195. package/dist/selftest/sync.test.d.ts +3 -0
  196. package/dist/selftest/sync.test.js +82 -0
  197. package/dist/shared/download.d.ts +58 -0
  198. package/dist/shared/download.js +200 -0
  199. package/dist/shared/guest-paths.d.ts +30 -0
  200. package/dist/shared/guest-paths.js +61 -0
  201. package/dist/shared/netrules.d.ts +18 -0
  202. package/dist/shared/netrules.js +98 -0
  203. package/dist/shared/paths.d.ts +9 -0
  204. package/dist/shared/paths.js +22 -0
  205. package/dist/shared/pty-client.d.ts +86 -0
  206. package/dist/shared/pty-client.js +227 -0
  207. package/dist/shared/rundir.d.ts +30 -0
  208. package/dist/shared/rundir.js +86 -0
  209. package/dist/shared/safe-remove.d.ts +10 -0
  210. package/dist/shared/safe-remove.js +55 -0
  211. package/dist/shared/schema.d.ts +84 -0
  212. package/dist/shared/schema.js +51 -0
  213. package/dist/shared/system.d.ts +15 -0
  214. package/dist/shared/system.js +19 -0
  215. package/dist/sync/claude-mem.d.ts +8 -0
  216. package/dist/sync/claude-mem.js +77 -0
  217. package/dist/sync/history.d.ts +30 -0
  218. package/dist/sync/history.js +129 -0
  219. package/dist/sync/watcher.d.ts +13 -0
  220. package/dist/sync/watcher.js +116 -0
  221. package/hooks/post-agent/README.txt +1 -0
  222. package/hooks/pre-provision/README.txt +1 -0
  223. package/package.json +91 -4
  224. package/sandbox/bootstrap.ps1 +258 -0
  225. package/sandbox/gitshim.cs +35 -0
  226. package/sandbox/logon.cmd +16 -0
  227. package/sandbox/ptyhost.cs +603 -0
  228. package/sandbox/trust.cmd +35 -0
  229. package/sandbox/vswhere.cs +83 -0
  230. package/schemas/config.schema.json +1062 -0
  231. package/schemas/sandbox-config.schema.json +952 -0
@@ -0,0 +1,14 @@
1
+ {
2
+ "harness": "claude",
3
+ "sandbox": { "memoryMb": "auto", "headless": false },
4
+ "provisioning": { "git": { "access": "readonly" } },
5
+ "toolchains": {
6
+ "node": { "version": "20", "extraVersions": ["18"] },
7
+ "python": { "version": "3.12" },
8
+ "rust": { "enabled": false }
9
+ },
10
+ "mappings": [
11
+ { "host": "D:\\Assets\\textures", "guest": "C:\\Assets", "readOnly": true, "optional": true }
12
+ ],
13
+ "scripts": []
14
+ }
package/README.md CHANGED
@@ -1,3 +1,79 @@
1
- # Temporary Holding Version
1
+ <div align="center">
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ # Windows Development Sandbox
4
+
5
+ **A throwaway Windows machine for every project, with or without an AI agent.**
6
+
7
+ [![Release](https://img.shields.io/github/v/release/JoshDiDuca/agent-sandbox?label=release)](https://github.com/JoshDiDuca/agent-sandbox/releases/latest)
8
+ [![CI](https://github.com/JoshDiDuca/agent-sandbox/actions/workflows/ci.yml/badge.svg)](https://github.com/JoshDiDuca/agent-sandbox/actions/workflows/ci.yml)
9
+ ![Windows 10/11 Pro, Enterprise, Education](https://img.shields.io/badge/Windows-10%20%7C%2011%20Pro-0078D4)
10
+ ![MIT](https://img.shields.io/badge/license-MIT-green)
11
+
12
+ </div>
13
+
14
+ Run it in a project folder and you get a clean [Windows Sandbox](https://learn.microsoft.com/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-overview)
15
+ where that folder is the workspace, the tools and databases the project needs install themselves, and nothing else
16
+ on your PC is reachable. Close it and it's gone. Your project, tools, databases and logins are kept for next time.
17
+
18
+ ## Install
19
+
20
+ ```powershell
21
+ irm https://github.com/JoshDiDuca/agent-sandbox/releases/latest/download/install.ps1 | iex
22
+ ```
23
+
24
+ It checks your PC, offers to turn on Windows Sandbox, and installs everything. It uses your Node.js 20+ if you have it,
25
+ otherwise a private copy just for this tool. Nothing is installed system-wide.
26
+ Needs Windows 10/11 **Pro, Enterprise or Education**. [Other ways to install](docs/install.md)
27
+
28
+ ## Use
29
+
30
+ ```powershell
31
+ cd C:\code\my-app
32
+
33
+ sandbox # menu: start an agent, a plain sandbox, diagnostics, cleanup ...
34
+ sandbox claude # Claude Code in a sandbox for this folder (or: claude-sandbox)
35
+ sandbox claude -t # ... in this terminal (Ctrl+] detaches, the session keeps running)
36
+ sandbox start # just the sandbox, no agent
37
+ sandbox opencode # any supported agent by name
38
+ ```
39
+
40
+ The first start downloads what the project needs (a few minutes, once). After that, starts take seconds.
41
+
42
+ > `claude-sbx`, `codex-sbx`, `gemini-sbx` and `agent-sandbox` are the old command names. They still work for now; use
43
+ > `sandbox <agent>` / `claude-sandbox` and `sandbox` instead.
44
+
45
+ ## What you get
46
+
47
+ | | |
48
+ |---|---|
49
+ | **Safe by default** | The agent sees only your project folder. Credentials are stripped before anything is copied in, your LAN is blocked, and nothing the sandbox writes can run on your PC. |
50
+ | **Languages** | Node, Python, Rust, C/C++ (GCC or MSVC), .NET (incl. .NET Framework targeting), Go, Java, Ruby, PHP, Deno, Bun, PowerShell 7, with pnpm, yarn, Volta, uv, pyenv, Maven, Gradle, Composer, gh ... |
51
+ | **Databases** | PostgreSQL, MySQL, MongoDB, Redis and DynamoDB Local with a web UI, started only when the project uses them |
52
+ | **Agents** | Claude Code, Codex, Gemini, opencode, Qwen, Crush, Copilot, Kilo, Amp, Cline, Continue, Kimi, Aider, DeepSeek agents |
53
+ | **Smart** | Detects what the project needs from its files, respects version files, installs in parallel and reuses everything |
54
+ | **Feels like home** | Your desktop look, Claude settings, MCP servers and conversation history come along; history syncs back |
55
+
56
+ ## Commands
57
+
58
+ | Command | |
59
+ |---|---|
60
+ | `sandbox` | the interactive menu: repeat your last command, start agents, every option, and all settings |
61
+ | `sandbox <agent>`, `claude-sandbox` | start an agent; `-t` for this terminal, `--headless` for no window |
62
+ | `sandbox start` | the sandbox without an agent |
63
+ | `sandbox attach` / `sessions` / `status` | work with a running sandbox |
64
+ | `sandbox exec -- <cmd>` | run a command inside |
65
+ | `sandbox stop` / `hide` / `show` | shut down, hide or show the window |
66
+ | `sandbox data` / `data clean` | what's stored and how big, and freeing space |
67
+ | `sandbox setup` / `doctor` / `repair` | check this PC, see what will be installed, fix common problems |
68
+
69
+ All commands and options: [docs/commands.md](docs/commands.md)
70
+
71
+ ## Documentation
72
+
73
+ - [Install](docs/install.md): requirements, other ways to install, upgrading
74
+ - [Commands](docs/commands.md): every command and option, the menu, sessions and attaching
75
+ - [Tools and databases](docs/toolchains.md): languages, package managers, databases, agents, what is tested
76
+ - [Configuration](docs/configuration.md): settings, project files, paths, accounts, hooks
77
+ - [Security](docs/security.md): how your PC is protected, secrets, git access
78
+ - [Troubleshooting](docs/troubleshooting.md): common problems and fixes
79
+ - [Development](docs/development.md): building, testing, releasing (code layout in [CLAUDE.md](CLAUDE.md))
@@ -0,0 +1,332 @@
1
+ {
2
+ "$schema": "./schemas/config.schema.json",
3
+ "defaultHarness": "claude",
4
+ "guestWorkspace": "auto",
5
+ "readOnly": false,
6
+ "mappings": [],
7
+ "sandbox": {
8
+ "memoryMb": "auto",
9
+ "maxMemoryMb": 32768,
10
+ "reserveHostMb": 8192,
11
+ "vGpu": false,
12
+ "networking": true,
13
+ "clipboard": true,
14
+ "audioInput": false,
15
+ "videoInput": false,
16
+ "printerRedirection": false,
17
+ "protectedClient": true,
18
+ "headless": false
19
+ },
20
+ "storage": {
21
+ "root": "%LOCALAPPDATA%\\AgentSandbox",
22
+ "persistAgentState": true,
23
+ "dataName": "default"
24
+ },
25
+ "network": {
26
+ "blockPrivateRanges": true
27
+ },
28
+ "provisioning": {
29
+ "copyFromHost": true,
30
+ "fallbackToInstall": true,
31
+ "refresh": false,
32
+ "git": {
33
+ "enabled": true,
34
+ "access": "full"
35
+ },
36
+ "terminal": {
37
+ "enabled": true
38
+ }
39
+ },
40
+ "toolchains": {
41
+ "node": {
42
+ "version": "host",
43
+ "extraVersions": [],
44
+ "corepack": true,
45
+ "volta": "auto",
46
+ "globalPackages": []
47
+ },
48
+ "python": {
49
+ "enabled": "auto",
50
+ "version": "3",
51
+ "python2": true,
52
+ "pyenv": "auto",
53
+ "tools": []
54
+ },
55
+ "rust": {
56
+ "enabled": "auto",
57
+ "toolchain": "stable",
58
+ "host": "auto",
59
+ "components": [],
60
+ "targets": [],
61
+ "crates": [],
62
+ "targetDir": "separate"
63
+ },
64
+ "msvc": {
65
+ "enabled": "auto",
66
+ "acceptLicense": false,
67
+ "msvcVersion": "latest",
68
+ "sdkVersion": "latest"
69
+ },
70
+ "cpp": {
71
+ "enabled": "auto",
72
+ "flexBison": true
73
+ },
74
+ "dotnet": {
75
+ "enabled": "auto",
76
+ "channels": [
77
+ "LTS"
78
+ ],
79
+ "tools": [],
80
+ "workloads": [],
81
+ "frameworkTargets": [
82
+ "net48",
83
+ "net472"
84
+ ],
85
+ "netfx35": false
86
+ },
87
+ "go": {
88
+ "enabled": "auto",
89
+ "version": "stable",
90
+ "tools": []
91
+ },
92
+ "java": {
93
+ "enabled": "auto",
94
+ "version": "lts",
95
+ "maven": true,
96
+ "gradle": true
97
+ },
98
+ "ruby": {
99
+ "enabled": "auto",
100
+ "version": "3",
101
+ "gems": []
102
+ },
103
+ "php": {
104
+ "enabled": "auto",
105
+ "version": "8",
106
+ "composer": true
107
+ },
108
+ "deno": {
109
+ "enabled": "auto"
110
+ },
111
+ "pwsh": {
112
+ "enabled": "auto"
113
+ },
114
+ "cli": {
115
+ "gh": "auto",
116
+ "zstd": false,
117
+ "openssl": "auto"
118
+ },
119
+ "bun": {
120
+ "enabled": true
121
+ },
122
+ "uv": {
123
+ "enabled": true
124
+ },
125
+ "vcRuntime": {
126
+ "enabled": false
127
+ },
128
+ "mesa": {
129
+ "enabled": false,
130
+ "vulkan": false
131
+ },
132
+ "vscode": {
133
+ "enabled": true
134
+ },
135
+ "environment": {}
136
+ },
137
+ "databases": {
138
+ "postgres": {
139
+ "enabled": "auto",
140
+ "version": "latest",
141
+ "port": 5432
142
+ },
143
+ "mysql": {
144
+ "enabled": "auto",
145
+ "version": "lts",
146
+ "port": 3306
147
+ },
148
+ "mongodb": {
149
+ "enabled": "auto",
150
+ "version": "latest",
151
+ "port": 27017
152
+ },
153
+ "redis": {
154
+ "enabled": "auto",
155
+ "port": 6379
156
+ },
157
+ "dynamodb": {
158
+ "enabled": "auto",
159
+ "port": 8000,
160
+ "adminPort": 8001,
161
+ "admin": true
162
+ },
163
+ "sqlserver": {
164
+ "enabled": "auto"
165
+ }
166
+ },
167
+ "attach": {
168
+ "enabled": true,
169
+ "reuseSession": true,
170
+ "auto": false,
171
+ "autoHide": false
172
+ },
173
+ "secrets": {
174
+ "strip": true,
175
+ "allow": [],
176
+ "patterns": [],
177
+ "warnFiles": true
178
+ },
179
+ "personalization": {
180
+ "enabled": true
181
+ },
182
+ "claudeProfile": {
183
+ "enabled": true,
184
+ "hostDir": "auto",
185
+ "include": [
186
+ "settings.json",
187
+ "CLAUDE.md",
188
+ "commands",
189
+ "agents",
190
+ "skills",
191
+ "plugins"
192
+ ],
193
+ "globalStateFile": "auto",
194
+ "copyCredentials": false,
195
+ "overwrite": true,
196
+ "syncHistory": true,
197
+ "syncClaudeMem": true
198
+ },
199
+ "harnesses": {
200
+ "claude": {
201
+ "hostExecutable": "claude.exe",
202
+ "hostDir": "auto",
203
+ "npmPackage": "@anthropic-ai/claude-code@latest",
204
+ "npmBin": "claude",
205
+ "arguments": [],
206
+ "environment": {
207
+ "DISABLE_AUTOUPDATER": "1"
208
+ },
209
+ "resumeArguments": [
210
+ "--continue"
211
+ ]
212
+ },
213
+ "codex": {
214
+ "npmPackage": "@openai/codex@latest",
215
+ "npmBin": "codex",
216
+ "arguments": [],
217
+ "environment": {},
218
+ "resumeArguments": [
219
+ "resume",
220
+ "--last"
221
+ ]
222
+ },
223
+ "gemini": {
224
+ "npmPackage": "@google/gemini-cli@latest",
225
+ "npmBin": "gemini",
226
+ "arguments": [],
227
+ "environment": {},
228
+ "resumeArguments": [
229
+ "--resume"
230
+ ]
231
+ },
232
+ "opencode": {
233
+ "npmPackage": "opencode-ai@latest",
234
+ "npmBin": "opencode",
235
+ "arguments": [],
236
+ "environment": {},
237
+ "resumeArguments": [
238
+ "--continue"
239
+ ]
240
+ },
241
+ "qwen": {
242
+ "npmPackage": "@qwen-code/qwen-code@latest",
243
+ "npmBin": "qwen",
244
+ "arguments": [],
245
+ "environment": {},
246
+ "resumeArguments": [
247
+ "--continue"
248
+ ]
249
+ },
250
+ "crush": {
251
+ "npmPackage": "@charmland/crush@latest",
252
+ "npmBin": "crush",
253
+ "arguments": [],
254
+ "environment": {},
255
+ "resumeArguments": [
256
+ "--continue"
257
+ ]
258
+ },
259
+ "copilot": {
260
+ "npmPackage": "@github/copilot@latest",
261
+ "npmBin": "copilot",
262
+ "arguments": [],
263
+ "environment": {},
264
+ "resumeArguments": [
265
+ "--continue"
266
+ ]
267
+ },
268
+ "kilo": {
269
+ "npmPackage": "@kilocode/cli@latest",
270
+ "npmBin": "kilo",
271
+ "arguments": [],
272
+ "environment": {},
273
+ "resumeArguments": [
274
+ "--continue"
275
+ ]
276
+ },
277
+ "amp": {
278
+ "npmPackage": "@ampcode/cli@latest",
279
+ "npmBin": "amp",
280
+ "arguments": [],
281
+ "environment": {}
282
+ },
283
+ "cline": {
284
+ "npmPackage": "cline@latest",
285
+ "npmBin": "cline",
286
+ "arguments": [],
287
+ "environment": {}
288
+ },
289
+ "continue": {
290
+ "npmPackage": "@continuedev/cli@latest",
291
+ "npmBin": "cn",
292
+ "arguments": [],
293
+ "environment": {},
294
+ "resumeArguments": [
295
+ "--resume"
296
+ ]
297
+ },
298
+ "kimi": {
299
+ "npmPackage": "@moonshot-ai/kimi-code@latest",
300
+ "npmBin": "kimi",
301
+ "arguments": [],
302
+ "environment": {},
303
+ "resumeArguments": [
304
+ "-c"
305
+ ]
306
+ },
307
+ "reasonix": {
308
+ "npmPackage": "reasonix@latest",
309
+ "npmBin": "reasonix",
310
+ "arguments": [],
311
+ "environment": {}
312
+ },
313
+ "deepseek": {
314
+ "npmPackage": "codewhale@latest",
315
+ "npmBin": "codewhale",
316
+ "arguments": [],
317
+ "environment": {}
318
+ },
319
+ "aider": {
320
+ "uvPackage": "aider-chat",
321
+ "uvBin": "aider",
322
+ "arguments": [],
323
+ "environment": {},
324
+ "resumeArguments": [
325
+ "--restore-chat-history"
326
+ ]
327
+ }
328
+ },
329
+ "hooks": {
330
+ "failFast": false
331
+ }
332
+ }
package/dist/api.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ import type { GuestResponse, SandboxStatus, SessionStatus } from './core/types.js';
2
+ export interface SandboxClient {
3
+ /** True while a Windows Sandbox is running. */
4
+ isRunning(): boolean;
5
+ /** Boot status written by the sandbox (null if it never started). */
6
+ status(): SandboxStatus | null;
7
+ /** Waits until provisioning is finished. */
8
+ ready(): Promise<SandboxStatus>;
9
+ sessions(): SessionStatus[];
10
+ /** Runs a command inside the sandbox; `cwd` is a guest path inside the workspace (default: the workspace). */
11
+ exec(command: string[], options?: {
12
+ cwd?: string;
13
+ timeoutSeconds?: number;
14
+ }): Promise<GuestResponse>;
15
+ /** Starts another agent session (its own terminal tab in the sandbox) and resolves once it is running. */
16
+ startSession(options?: {
17
+ harness?: string;
18
+ args?: string[];
19
+ cwd?: string;
20
+ }): Promise<SessionStatus>;
21
+ /** Restarts running sessions in place (they resume their conversation). */
22
+ restart(harness?: string): Promise<GuestResponse>;
23
+ ping(): Promise<GuestResponse>;
24
+ /** Bridges the current terminal to a session (interactive programs only). */
25
+ attach(sessionId?: string): Promise<number>;
26
+ }
27
+ export declare const sandbox: (options?: {
28
+ config?: string;
29
+ }) => SandboxClient;
30
+ export type { GuestResponse, SandboxStatus, SessionStatus } from './core/types.js';
31
+ export { main } from './cli/index.js';
package/dist/api.js ADDED
@@ -0,0 +1,30 @@
1
+ // Programmatic API: `import { sandbox } from 'windows-development-sandbox'`. Same safety model as the CLI: the host only sends the
2
+ // request kinds the guest daemon accepts, and everything coming back is validated data.
3
+ import path from 'node:path';
4
+ import { attachTerminal, execInSandbox, pickSession, pingSandbox, requestSession, restartSessions, waitForReady, waitForSession } from './host/channel.js';
5
+ import { loadConfig } from './core/config.js';
6
+ import { listSessions, readSandboxStatus } from './shared/rundir.js';
7
+ import { isSandboxRunning } from './host/platform.js';
8
+ import { expandPath, fail } from './core/util.js';
9
+ export const sandbox = (options = {}) => {
10
+ const loaded = loadConfig(options.config);
11
+ const dataPath = path.join(expandPath(loaded.config.storage.root, loaded.base), 'data', loaded.config.storage.dataName);
12
+ const alive = isSandboxRunning;
13
+ // async: no sandbox is a rejected promise like every other failure, not a synchronous throw.
14
+ const ready = async () => (alive() ? waitForReady(dataPath, null, alive) : fail('No Windows Sandbox is running.', 'Start one first, e.g. sandbox claude --headless.'));
15
+ return {
16
+ isRunning: alive,
17
+ status: () => readSandboxStatus(dataPath),
18
+ ready,
19
+ sessions: () => listSessions(dataPath),
20
+ exec: async (command, o = {}) => execInSandbox(dataPath, command, o.cwd ?? (await ready()).guestWorkspace, o.timeoutSeconds ?? 600, alive),
21
+ startSession: async (o = {}) => {
22
+ const status = await ready();
23
+ return waitForSession(dataPath, requestSession(dataPath, o.harness ?? loaded.config.defaultHarness, o.args ?? [], o.cwd ?? status.guestWorkspace), alive);
24
+ },
25
+ restart: async (harness) => { await ready(); return restartSessions(dataPath, harness ?? null, alive); },
26
+ ping: async () => { await ready(); return pingSandbox(dataPath, alive); },
27
+ attach: async (sessionId) => { await ready(); return attachTerminal(pickSession(dataPath, sessionId)); },
28
+ };
29
+ };
30
+ export { main } from './cli/index.js';
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { run } from '../cli/index.js';
3
+ run(process.argv.slice(2));
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { run } from '../cli/index.js';
3
+ const args = process.argv.slice(2);
4
+ const personal = args.includes('--personal') ? ['--personal'] : [];
5
+ run(['host-claude', ...personal, '--', ...args.filter((a) => a !== '--personal')]);
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { run } from '../cli/index.js';
3
+ run(process.argv.slice(2), { harness: 'claude' });
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { run } from '../cli/index.js';
3
+ run(process.argv.slice(2), { harness: 'codex' });
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { run } from '../cli/index.js';
3
+ run(process.argv.slice(2), { harness: 'gemini' });
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ // sandbox / windows-development-sandbox: the menu with no arguments, any command, or `sandbox <agent>`.
3
+ import { run } from '../cli/index.js';
4
+ run(process.argv.slice(2));
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { run } from '../cli/index.js';
3
+ run(process.argv.slice(2), { command: 'hide' });
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { run } from '../cli/index.js';
3
+ run(process.argv.slice(2), { command: 'show' });
@@ -0,0 +1,32 @@
1
+ import { Command } from 'commander';
2
+ export interface CliOptions {
3
+ command: string;
4
+ positionals: string[];
5
+ passthrough: string[];
6
+ config?: string;
7
+ workspace?: string;
8
+ harness?: string;
9
+ account?: string;
10
+ node?: string;
11
+ python?: string;
12
+ scripts: string[];
13
+ databases: string[];
14
+ headless?: boolean;
15
+ terminal: boolean;
16
+ newSession: boolean;
17
+ noAgent: boolean;
18
+ trustConfig: boolean;
19
+ noLocalConfig: boolean;
20
+ personal: boolean;
21
+ fromHost: boolean;
22
+ noRestart: boolean;
23
+ follow: boolean;
24
+ json: boolean;
25
+ yes: boolean;
26
+ timeout: number;
27
+ days: number;
28
+ }
29
+ /** Every command, its options and help text, from manifest.ts. Actions only record what was parsed. */
30
+ export declare const buildProgram: (record: (name: string, cmd: Command) => void) => Command;
31
+ /** Parses argv into the command name and options. Throws commander errors for unknown commands/options. */
32
+ export declare const parseCli: (argv: string[], wrapper?: boolean) => CliOptions;