windows-development-sandbox 1.1.0 → 1.4.1

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 (222) hide show
  1. package/.sandbox-config.example.json +2 -1
  2. package/README.md +3 -2
  3. package/config.example.json +39 -5
  4. package/dist/cli/args.d.ts +3 -0
  5. package/dist/cli/args.js +3 -1
  6. package/dist/cli/boot-progress.d.ts +22 -0
  7. package/dist/cli/boot-progress.js +59 -0
  8. package/dist/cli/commands/accounts.js +2 -2
  9. package/dist/cli/commands/agent-commands.js +1 -1
  10. package/dist/cli/commands/context.js +2 -1
  11. package/dist/cli/commands/data/clean.js +6 -1
  12. package/dist/cli/commands/data/collect.js +3 -3
  13. package/dist/cli/commands/index.d.ts +1 -1
  14. package/dist/cli/commands/index.js +1 -1
  15. package/dist/cli/commands/launch.d.ts +5 -2
  16. package/dist/cli/commands/launch.js +113 -25
  17. package/dist/cli/commands/maintenance.d.ts +2 -0
  18. package/dist/cli/commands/maintenance.js +70 -4
  19. package/dist/cli/commands/project.d.ts +10 -6
  20. package/dist/cli/commands/project.js +42 -3
  21. package/dist/cli/commands/restart.js +17 -7
  22. package/dist/cli/commands/sessions.js +5 -4
  23. package/dist/cli/commands/user-config.js +1 -1
  24. package/dist/cli/index.js +6 -4
  25. package/dist/cli/manifest.js +6 -1
  26. package/dist/cli/menu/apps.d.ts +21 -0
  27. package/dist/cli/menu/apps.js +122 -0
  28. package/dist/cli/menu/command-form.d.ts +28 -0
  29. package/dist/cli/menu/command-form.js +219 -0
  30. package/dist/cli/menu/index.d.ts +26 -0
  31. package/dist/cli/menu/index.js +180 -0
  32. package/dist/cli/menu/settings/categories.d.ts +9 -0
  33. package/dist/cli/menu/settings/categories.js +28 -0
  34. package/dist/cli/menu/settings/config-file.d.ts +40 -0
  35. package/dist/cli/menu/settings/config-file.js +71 -0
  36. package/dist/cli/menu/settings/editors.d.ts +30 -0
  37. package/dist/cli/menu/settings/editors.js +305 -0
  38. package/dist/cli/menu/settings/index.d.ts +32 -0
  39. package/dist/cli/menu/settings/index.js +136 -0
  40. package/dist/cli/menu/settings/schema-node.d.ts +62 -0
  41. package/dist/cli/menu/settings/schema-node.js +104 -0
  42. package/dist/cli/{menu-multi.d.ts → menu/several.d.ts} +10 -2
  43. package/dist/cli/menu/several.js +102 -0
  44. package/dist/cli/progress.d.ts +15 -0
  45. package/dist/cli/progress.js +52 -0
  46. package/dist/cli/tui/app.d.ts +39 -0
  47. package/dist/cli/tui/app.js +52 -0
  48. package/dist/cli/tui/dialogs.d.ts +57 -0
  49. package/dist/cli/tui/dialogs.js +162 -0
  50. package/dist/cli/tui/frame.d.ts +18 -0
  51. package/dist/cli/tui/frame.js +27 -0
  52. package/dist/cli/tui/index.d.ts +7 -0
  53. package/dist/cli/tui/index.js +8 -0
  54. package/dist/cli/tui/list-screen.d.ts +101 -0
  55. package/dist/cli/tui/list-screen.js +299 -0
  56. package/dist/cli/tui/terminal.d.ts +37 -0
  57. package/dist/cli/tui/terminal.js +89 -0
  58. package/dist/cli/tui/text.d.ts +20 -0
  59. package/dist/cli/tui/text.js +105 -0
  60. package/dist/cli/tui/theme.d.ts +45 -0
  61. package/dist/cli/tui/theme.js +30 -0
  62. package/dist/core/config.js +10 -7
  63. package/dist/core/local-config.d.ts +31 -1
  64. package/dist/core/local-config.js +72 -7
  65. package/dist/core/project-policy.d.ts +50 -3
  66. package/dist/core/project-policy.js +90 -4
  67. package/dist/core/schema/apps.d.ts +40 -0
  68. package/dist/core/schema/apps.js +27 -0
  69. package/dist/core/schema/config.d.ts +69 -3
  70. package/dist/core/schema/config.js +18 -6
  71. package/dist/core/schema/profile.d.ts +5 -0
  72. package/dist/core/schema/profile.js +4 -2
  73. package/dist/core/schema/projects.d.ts +1 -0
  74. package/dist/core/schema/projects.js +1 -0
  75. package/dist/core/schema/sandbox.d.ts +29 -1
  76. package/dist/core/schema/sandbox.js +29 -1
  77. package/dist/core/schema/toolchains.d.ts +3 -0
  78. package/dist/core/schema/toolchains.js +6 -1
  79. package/dist/core/types.d.ts +24 -1
  80. package/dist/core/util.d.ts +2 -0
  81. package/dist/core/util.js +2 -0
  82. package/dist/core/workspace.d.ts +21 -4
  83. package/dist/core/workspace.js +99 -21
  84. package/dist/guest/apps/index.d.ts +10 -0
  85. package/dist/guest/apps/index.js +206 -0
  86. package/dist/guest/apps/resolvers.d.ts +8 -0
  87. package/dist/guest/apps/resolvers.js +90 -0
  88. package/dist/guest/audit-parse.d.ts +7 -0
  89. package/dist/guest/audit-parse.js +24 -0
  90. package/dist/guest/audit.d.ts +4 -0
  91. package/dist/guest/audit.js +47 -0
  92. package/dist/guest/daemon/relays.d.ts +1 -0
  93. package/dist/guest/daemon/relays.js +18 -0
  94. package/dist/guest/daemon.js +4 -0
  95. package/dist/guest/env.d.ts +7 -2
  96. package/dist/guest/env.js +17 -3
  97. package/dist/guest/helpers.d.ts +1 -1
  98. package/dist/guest/main.js +20 -3
  99. package/dist/guest/netproxy.d.ts +1 -0
  100. package/dist/guest/netproxy.js +100 -0
  101. package/dist/guest/ptyhost.js +14 -4
  102. package/dist/guest/setup/claude.d.ts +0 -4
  103. package/dist/guest/setup/claude.js +48 -2
  104. package/dist/guest/setup/network.d.ts +9 -0
  105. package/dist/guest/setup/network.js +97 -4
  106. package/dist/guest/setup/user.js +4 -0
  107. package/dist/guest/toolchains/index.js +29 -3
  108. package/dist/guest/toolchains/native/mesa.js +13 -3
  109. package/dist/guest/toolchains/plan.d.ts +3 -1
  110. package/dist/guest/toolchains/plan.js +53 -9
  111. package/dist/guest/toolchains/python.js +26 -2
  112. package/dist/guest/toolchains/vscode-profile.d.ts +30 -0
  113. package/dist/guest/toolchains/vscode-profile.js +69 -0
  114. package/dist/guest/toolchains/vscode.d.ts +17 -0
  115. package/dist/guest/toolchains/vscode.js +87 -1
  116. package/dist/host/attach.js +2 -1
  117. package/dist/host/audit/collect.d.ts +34 -0
  118. package/dist/host/audit/collect.js +126 -0
  119. package/dist/host/audit/log.d.ts +46 -0
  120. package/dist/host/audit/log.js +143 -0
  121. package/dist/host/channel.d.ts +2 -2
  122. package/dist/host/channel.js +3 -2
  123. package/dist/host/generate.d.ts +7 -1
  124. package/dist/host/generate.js +23 -6
  125. package/dist/host/join.d.ts +7 -0
  126. package/dist/host/join.js +23 -9
  127. package/dist/host/launch/mappings.d.ts +7 -2
  128. package/dist/host/launch/mappings.js +68 -18
  129. package/dist/host/launch/projects.d.ts +2 -0
  130. package/dist/host/launch/projects.js +11 -5
  131. package/dist/host/launch/stage.js +1 -1
  132. package/dist/host/motw.d.ts +17 -0
  133. package/dist/host/motw.js +74 -0
  134. package/dist/host/platform.js +3 -0
  135. package/dist/host/port-forward.d.ts +8 -0
  136. package/dist/host/port-forward.js +37 -0
  137. package/dist/host/projects.d.ts +25 -2
  138. package/dist/host/projects.js +54 -5
  139. package/dist/host/repo-guard.d.ts +10 -3
  140. package/dist/host/repo-guard.js +142 -14
  141. package/dist/host/stops.d.ts +67 -0
  142. package/dist/host/stops.js +126 -0
  143. package/dist/host/terminal.d.ts +8 -0
  144. package/dist/host/terminal.js +45 -1
  145. package/dist/host/workspace-view/index.d.ts +20 -0
  146. package/dist/host/workspace-view/index.js +53 -0
  147. package/dist/host/workspace-view/rules.d.ts +26 -0
  148. package/dist/host/workspace-view/rules.js +93 -0
  149. package/dist/host/workspace-view/view.d.ts +50 -0
  150. package/dist/host/workspace-view/view.js +281 -0
  151. package/dist/runtime/daemon.js +1387 -558
  152. package/dist/runtime/db.js +199 -14
  153. package/dist/runtime/main.js +3082 -631
  154. package/dist/runtime/netproxy.js +25948 -0
  155. package/dist/runtime/view.js +531 -148
  156. package/dist/selftest/audit.test.d.ts +2 -0
  157. package/dist/selftest/audit.test.js +57 -0
  158. package/dist/selftest/channel.test.js +45 -2
  159. package/dist/selftest/cli.test.js +47 -17
  160. package/dist/selftest/fixtures.d.ts +47 -1
  161. package/dist/selftest/fixtures.js +3 -1
  162. package/dist/selftest/generate.test.js +7 -2
  163. package/dist/selftest/index.js +6 -2
  164. package/dist/selftest/live-network.test.d.ts +2 -0
  165. package/dist/selftest/live-network.test.js +63 -0
  166. package/dist/selftest/live-terminal.test.d.ts +2 -0
  167. package/dist/selftest/live-terminal.test.js +169 -0
  168. package/dist/selftest/local-config.test.js +42 -4
  169. package/dist/selftest/mirror.test.js +36 -7
  170. package/dist/selftest/network.test.js +12 -0
  171. package/dist/selftest/projects.test.js +77 -8
  172. package/dist/selftest/repo-guard.test.js +59 -1
  173. package/dist/selftest/sync.test.js +50 -10
  174. package/dist/selftest/toolchains.test.js +30 -0
  175. package/dist/selftest/workspace-view.test.d.ts +2 -0
  176. package/dist/selftest/workspace-view.test.js +89 -0
  177. package/dist/shared/apps.d.ts +49 -0
  178. package/dist/shared/apps.js +114 -0
  179. package/dist/shared/console-input.d.ts +11 -0
  180. package/dist/shared/console-input.js +61 -0
  181. package/dist/shared/download.d.ts +3 -0
  182. package/dist/shared/download.js +25 -2
  183. package/dist/shared/guest-paths.d.ts +27 -0
  184. package/dist/shared/guest-paths.js +68 -0
  185. package/dist/shared/netpolicy.d.ts +27 -0
  186. package/dist/shared/netpolicy.js +51 -0
  187. package/dist/shared/projects.d.ts +27 -4
  188. package/dist/shared/projects.js +72 -13
  189. package/dist/shared/pty-client.d.ts +26 -4
  190. package/dist/shared/pty-client.js +204 -25
  191. package/dist/shared/rundir.d.ts +2 -0
  192. package/dist/shared/rundir.js +2 -0
  193. package/dist/shared/schema.d.ts +34 -0
  194. package/dist/shared/schema.js +14 -0
  195. package/dist/shared/system.d.ts +1 -0
  196. package/dist/shared/system.js +1 -0
  197. package/dist/sync/claude-mem.js +3 -2
  198. package/dist/sync/history.d.ts +6 -0
  199. package/dist/sync/history.js +26 -11
  200. package/dist/sync/watcher.js +78 -6
  201. package/package.json +2 -1
  202. package/sandbox/cargoshim.cs +56 -0
  203. package/sandbox/cpucap.cs +33 -0
  204. package/sandbox/cpucap.ps1 +4 -35
  205. package/sandbox/logon.cmd +6 -0
  206. package/sandbox/memlog.ps1 +34 -0
  207. package/sandbox/pagefile.cs +31 -0
  208. package/sandbox/pagefile.ps1 +21 -0
  209. package/sandbox/ptyhost.cs +162 -7
  210. package/schemas/config.schema.json +318 -3
  211. package/schemas/sandbox-config.schema.json +129 -14
  212. package/dist/cli/menu-multi.js +0 -82
  213. package/dist/cli/menu.d.ts +0 -14
  214. package/dist/cli/menu.js +0 -290
  215. package/dist/cli/settings/edit.d.ts +0 -13
  216. package/dist/cli/settings/edit.js +0 -19
  217. package/dist/cli/settings/index.d.ts +0 -8
  218. package/dist/cli/settings/index.js +0 -131
  219. package/dist/cli/settings/prompts.d.ts +0 -7
  220. package/dist/cli/settings/prompts.js +0 -48
  221. package/dist/cli/settings/schema.d.ts +0 -33
  222. package/dist/cli/settings/schema.js +0 -29
@@ -32,6 +32,62 @@
32
32
  "type": "boolean",
33
33
  "description": "Map the workspace read-only."
34
34
  },
35
+ "workspaceFilter": {
36
+ "type": "object",
37
+ "properties": {
38
+ "enabled": {
39
+ "type": "boolean",
40
+ "description": "Keep what your .gitignore lists (.env files, node_modules, build output ...) out of the sandbox. The sandbox works on a copy of the project without those files, kept in step with it both ways within about a second; what it creates that is ignored (its own node_modules, builds) stays in the sandbox. Git works as usual. Off = the project folder itself is mapped."
41
+ },
42
+ "exclude": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "string",
46
+ "maxLength": 500
47
+ },
48
+ "description": "Also keep these out, as .gitignore patterns, e.g. secrets/, *.pem, data/private/."
49
+ },
50
+ "include": {
51
+ "type": "array",
52
+ "items": {
53
+ "type": "string",
54
+ "maxLength": 500
55
+ },
56
+ "description": "Let these in although .gitignore lists them, e.g. .env.example, data/fixtures/."
57
+ }
58
+ },
59
+ "additionalProperties": false
60
+ },
61
+ "audit": {
62
+ "type": "object",
63
+ "properties": {
64
+ "enabled": {
65
+ "type": "boolean",
66
+ "description": "Keep an audit log on this PC of what happened in your sandboxes: programs started (with their command lines), files changed in the project, sessions, and what the repo guard caught. The sandbox cannot change it. Read it with sandbox audit."
67
+ },
68
+ "days": {
69
+ "type": "integer",
70
+ "minimum": 1,
71
+ "maximum": 365,
72
+ "description": "Days the audit log is kept."
73
+ },
74
+ "maxMb": {
75
+ "type": "integer",
76
+ "minimum": 5,
77
+ "maximum": 5000,
78
+ "description": "Most space the audit log may take, in MB (older days go first). Days before today are compressed."
79
+ },
80
+ "processes": {
81
+ "type": "boolean",
82
+ "description": "Record every program started in the sandbox with its command line (Windows process auditing; repeated runs are counted, not listed)."
83
+ },
84
+ "files": {
85
+ "type": "boolean",
86
+ "description": "Record the files changed in the project while the sandbox runs."
87
+ }
88
+ },
89
+ "additionalProperties": false
90
+ },
35
91
  "mappings": {
36
92
  "type": "array",
37
93
  "items": {
@@ -43,8 +99,10 @@
43
99
  "description": "Folder on this PC (relative paths are relative to the config file)."
44
100
  },
45
101
  "guest": {
102
+ "description": "Where it appears inside the sandbox, e.g. C:\\Assets, or on another drive letter (D: to Z:) such as F:\\SteamLibrary\\steamapps\\common\\Game (shown as F: at boot). Leave it out to use the same path as on this PC (a folder inside the project stays where it is in the project). A path the sandbox cannot use (C:\\Windows\\..., C:\\Users\\..., one already in use) goes to C:\\Mapped\\<drive>\\<path> instead, and the launch says so.",
46
103
  "type": "string",
47
- "description": "Where it appears inside the sandbox, e.g. C:\\Assets, or on another drive letter (D: to Z:) such as F:\\SteamLibrary\\steamapps\\common\\Game: mapped to C:\\Mirror\\F\\... and shown as F: (subst) at boot."
104
+ "minLength": 1,
105
+ "maxLength": 1024
48
106
  },
49
107
  "readOnly": {
50
108
  "type": "boolean",
@@ -102,6 +160,12 @@
102
160
  ],
103
161
  "description": "Most of this PC's CPU the sandbox may use, in percent (5-100), e.g. 50 keeps half free for you; \"none\" = no cap (Windows Sandbox would take every processor). Covers everything this tool starts in the sandbox (agents, installs, builds, its terminal)."
104
162
  },
163
+ "pageFileMb": {
164
+ "type": "integer",
165
+ "minimum": 0,
166
+ "maximum": 262144,
167
+ "description": "Size of the sandbox's paging file in MB, created at full size when it starts so it never grows while builds run (8 GB of its disk always stays free). Windows Sandbox starts with about 1 GB: parallel builds then fail with \"The paging file is too small\", and Windows grows the file under load. 0 = leave Windows' own."
168
+ },
105
169
  "reserveHostMb": {
106
170
  "type": "integer",
107
171
  "minimum": 0,
@@ -139,6 +203,10 @@
139
203
  "headless": {
140
204
  "type": "boolean",
141
205
  "description": "Hide the sandbox window (sbx-show brings it back). A headless sandbox shuts down when its last session ends."
206
+ },
207
+ "keepAwake": {
208
+ "type": "boolean",
209
+ "description": "Keep this PC from sleeping while a sandbox runs, so agents left working overnight keep going (the screen may still turn off; closing a laptop lid still sleeps it)."
142
210
  }
143
211
  },
144
212
  "additionalProperties": false
@@ -159,6 +227,15 @@
159
227
  "type": "string",
160
228
  "pattern": "^[A-Za-z0-9_-]+$",
161
229
  "description": "Name of the persistent data set (C:\\AgentData) shared by all workspaces."
230
+ },
231
+ "markSandboxFiles": {
232
+ "type": "boolean",
233
+ "description": "Programs and scripts (.exe, .ps1, .bat, .cmd, .msi, .lnk ...) that appear or change in your project while a sandbox runs get Windows' \"downloaded from the internet\" mark, so SmartScreen and PowerShell ask before they run on this PC."
234
+ },
235
+ "warnDataGb": {
236
+ "type": "number",
237
+ "minimum": 0,
238
+ "description": "Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never. sandbox data shows what takes the space."
162
239
  }
163
240
  },
164
241
  "additionalProperties": false
@@ -169,6 +246,59 @@
169
246
  "blockPrivateRanges": {
170
247
  "type": "boolean",
171
248
  "description": "Block your LAN (10/8, 172.16/12, 192.168/16, SMB) from inside the sandbox."
249
+ },
250
+ "allowOnly": {
251
+ "type": "array",
252
+ "items": {
253
+ "type": "string",
254
+ "maxLength": 253,
255
+ "pattern": "^(@developer|(\\*\\.)?([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+)$"
256
+ },
257
+ "description": "Only these hosts can be reached once the sandbox is set up (tools still download first). *.example.com covers its subdomains; @developer adds package registries, GitHub, toolchain downloads and the AI providers. Programs go through a proxy in the sandbox (HTTP_PROXY); anything else is blocked by its firewall. Empty = no limit."
258
+ },
259
+ "blockHosts": {
260
+ "type": "array",
261
+ "items": {
262
+ "type": "string",
263
+ "maxLength": 253,
264
+ "pattern": "^([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+$"
265
+ },
266
+ "description": "Never reachable from the sandbox, e.g. production servers or telemetry (each exact name; the sandbox's hosts file sends them nowhere)."
267
+ },
268
+ "forwardPorts": {
269
+ "type": "array",
270
+ "items": {
271
+ "type": "object",
272
+ "properties": {
273
+ "pc": {
274
+ "type": "integer",
275
+ "minimum": 1,
276
+ "maximum": 65535,
277
+ "description": "The port on this PC (localhost only)."
278
+ },
279
+ "sandbox": {
280
+ "type": "integer",
281
+ "minimum": 1,
282
+ "maximum": 65535,
283
+ "description": "The port inside the sandbox (a server there may listen on localhost only)."
284
+ }
285
+ },
286
+ "additionalProperties": false
287
+ },
288
+ "description": "Reach servers in the sandbox from this PC: http://localhost:<pc> here goes to <sandbox> inside, while it runs. Nothing else on your network can use them."
289
+ },
290
+ "dns": {
291
+ "type": "array",
292
+ "items": {
293
+ "type": "string",
294
+ "pattern": "^\\d{1,3}(\\.\\d{1,3}){3}$"
295
+ },
296
+ "description": "DNS servers for the sandbox instead of your network's, e.g. 1.1.1.1 and 9.9.9.9."
297
+ },
298
+ "proxy": {
299
+ "type": "string",
300
+ "pattern": "^(https?:\\/\\/[^\\s]+)?$",
301
+ "description": "An HTTP proxy the sandbox uses to reach the internet (HTTP_PROXY / HTTPS_PROXY for everything in it), e.g. http://proxy.corp:8080. Empty = none."
172
302
  }
173
303
  },
174
304
  "additionalProperties": false
@@ -216,6 +346,16 @@
216
346
  }
217
347
  },
218
348
  "additionalProperties": false
349
+ },
350
+ "conpty": {
351
+ "type": "object",
352
+ "properties": {
353
+ "enabled": {
354
+ "type": "boolean",
355
+ "description": "Agent sessions use Microsoft's newer pseudo console (conpty.dll, downloaded once) instead of the one built into Windows: no garbled screen after resizing, real scrollback for the mouse wheel. Off = the one built into Windows."
356
+ }
357
+ },
358
+ "additionalProperties": false
219
359
  }
220
360
  },
221
361
  "additionalProperties": false
@@ -725,6 +865,22 @@
725
865
  "enabled": {
726
866
  "type": "boolean",
727
867
  "description": "Portable VS Code inside the sandbox (code on PATH, desktop shortcut); its settings and extensions persist."
868
+ },
869
+ "setup": {
870
+ "type": "boolean",
871
+ "description": "Point VS Code at the sandbox's own tools (JDK, Python, Go, compilers, .NET, Git, PowerShell 7 and Git Bash terminals) and install the language extensions for the toolchains in use."
872
+ },
873
+ "recommended": {
874
+ "type": "boolean",
875
+ "description": "Also install the extensions a project recommends in its .vscode/extensions.json."
876
+ },
877
+ "extensions": {
878
+ "type": "array",
879
+ "items": {
880
+ "type": "string",
881
+ "pattern": "^[\\w-]+\\.[\\w-]+$"
882
+ },
883
+ "description": "More extensions to install in every sandbox, e.g. eamodio.gitlens, ms-azuretools.vscode-docker."
728
884
  }
729
885
  },
730
886
  "additionalProperties": false
@@ -999,6 +1155,141 @@
999
1155
  },
1000
1156
  "additionalProperties": false
1001
1157
  },
1158
+ "apps": {
1159
+ "type": "object",
1160
+ "properties": {
1161
+ "install": {
1162
+ "type": "array",
1163
+ "items": {
1164
+ "type": "string",
1165
+ "enum": [
1166
+ "notepadpp",
1167
+ "sublime",
1168
+ "neovim",
1169
+ "dbeaver",
1170
+ "pgadmin",
1171
+ "heidisql",
1172
+ "sqlitebrowser",
1173
+ "compass",
1174
+ "redisinsight",
1175
+ "dbgate",
1176
+ "beekeeper",
1177
+ "dynamodb-admin",
1178
+ "bruno",
1179
+ "insomnia",
1180
+ "sourcegit",
1181
+ "githubdesktop",
1182
+ "lazygit",
1183
+ "7zip",
1184
+ "winmerge",
1185
+ "everything",
1186
+ "sysinternals",
1187
+ "imhex",
1188
+ "chrome",
1189
+ "firefox",
1190
+ "godot",
1191
+ "blender",
1192
+ "love",
1193
+ "defold",
1194
+ "pixelorama",
1195
+ "tiled",
1196
+ "kubectl",
1197
+ "helm",
1198
+ "k9s",
1199
+ "terraform",
1200
+ "azure-cli",
1201
+ "gcloud",
1202
+ "aws-cli",
1203
+ "drawio",
1204
+ "pandoc",
1205
+ "mitmproxy",
1206
+ "xh",
1207
+ "grpcurl",
1208
+ "k6",
1209
+ "jq",
1210
+ "yq",
1211
+ "ripgrep",
1212
+ "fd",
1213
+ "bat",
1214
+ "fzf",
1215
+ "delta",
1216
+ "just",
1217
+ "hyperfine",
1218
+ "watchexec",
1219
+ "protoc",
1220
+ "ninja",
1221
+ "ffmpeg",
1222
+ "sqlite",
1223
+ "shellcheck",
1224
+ "gitleaks"
1225
+ ]
1226
+ },
1227
+ "description": "Apps from the catalogue to install in every sandbox (the Apps screen in the menu lists them by category). Each is downloaded once and kept."
1228
+ },
1229
+ "custom": {
1230
+ "type": "object",
1231
+ "propertyNames": {
1232
+ "type": "string",
1233
+ "pattern": "^[a-z0-9][a-z0-9-]{0,40}$"
1234
+ },
1235
+ "additionalProperties": {
1236
+ "type": "object",
1237
+ "properties": {
1238
+ "name": {
1239
+ "type": "string",
1240
+ "minLength": 1,
1241
+ "maxLength": 80,
1242
+ "description": "The name on the desktop shortcut, e.g. \"My Tool\"."
1243
+ },
1244
+ "github": {
1245
+ "description": "GitHub repository (owner/repo): the file comes from its latest release.",
1246
+ "type": "string",
1247
+ "pattern": "^[\\w.-]+\\/[\\w.-]+$"
1248
+ },
1249
+ "asset": {
1250
+ "description": "With github: a pattern (regular expression) matching the release file, e.g. windows.*x64\\.zip$",
1251
+ "type": "string",
1252
+ "maxLength": 200
1253
+ },
1254
+ "url": {
1255
+ "description": "Or a direct https:// download link (zip, 7z, exe or msi).",
1256
+ "type": "string",
1257
+ "format": "starts_with",
1258
+ "pattern": "^https:\\/\\/.*"
1259
+ },
1260
+ "sha256": {
1261
+ "description": "SHA-256 of the download (GitHub releases usually publish one; then this is not needed).",
1262
+ "type": "string",
1263
+ "pattern": "^[0-9a-fA-F]{64}$"
1264
+ },
1265
+ "unpack": {
1266
+ "description": "archive (zip, 7z, tar: the default), file (a single .exe), nsis (an installer 7-Zip can open) or msi.",
1267
+ "type": "string",
1268
+ "enum": [
1269
+ "archive",
1270
+ "file",
1271
+ "nsis",
1272
+ "msi"
1273
+ ]
1274
+ },
1275
+ "exe": {
1276
+ "type": "string",
1277
+ "minLength": 1,
1278
+ "maxLength": 200,
1279
+ "description": "The program to start (found anywhere in the download), e.g. mytool.exe."
1280
+ },
1281
+ "cli": {
1282
+ "description": "A command-line tool: its folder goes on PATH instead of getting a desktop shortcut.",
1283
+ "type": "boolean"
1284
+ }
1285
+ },
1286
+ "additionalProperties": false
1287
+ },
1288
+ "description": "Programs of your own: a GitHub release or a download link, and the program to start. Installed like the catalogue apps."
1289
+ }
1290
+ },
1291
+ "additionalProperties": false
1292
+ },
1002
1293
  "claudeProfile": {
1003
1294
  "type": "object",
1004
1295
  "properties": {
@@ -1032,11 +1323,23 @@
1032
1323
  },
1033
1324
  "syncHistory": {
1034
1325
  "type": "boolean",
1035
- "description": "Bring all conversation history in, and sync new history back (path-translated)."
1326
+ "description": "Bring conversation history in, and sync new history back (path-translated)."
1327
+ },
1328
+ "historyScope": {
1329
+ "type": "string",
1330
+ "enum": [
1331
+ "project",
1332
+ "all"
1333
+ ],
1334
+ "description": "Which history comes in: \"project\" = only the projects in this sandbox (other projects' conversations, file backups and prompts stay on this PC), \"all\" = everything. Only this sandbox's projects ever sync back."
1036
1335
  },
1037
1336
  "syncClaudeMem": {
1038
1337
  "type": "boolean",
1039
- "description": "Bring claude-mem data in, and its database back when the sandbox closes."
1338
+ "description": "Bring claude-mem data into the sandbox (its settings and backups stay on this PC)."
1339
+ },
1340
+ "syncClaudeMemBack": {
1341
+ "type": "boolean",
1342
+ "description": "Also copy claude-mem's database back to this PC when the sandbox closes. Off by default: what is in it is loaded into every Claude session on this PC, so a compromised agent could plant instructions there."
1040
1343
  }
1041
1344
  },
1042
1345
  "additionalProperties": false
@@ -1148,6 +1451,18 @@
1148
1451
  },
1149
1452
  "description": "Parent folders you said no to (not asked again)."
1150
1453
  },
1454
+ "allowOutsideMappings": {
1455
+ "anyOf": [
1456
+ {
1457
+ "type": "string",
1458
+ "const": "ask"
1459
+ },
1460
+ {
1461
+ "type": "boolean"
1462
+ }
1463
+ ],
1464
+ "description": "A project's .sandbox-config.json may map folders from outside the project (e.g. a game folder on another drive). \"ask\" = an interactive launch asks once per project and set of folders, and remembers your answer; true = always allowed (still listed when you approve the file); false = never (the launch stops and says which folders). Only your own settings decide this, never a project file."
1465
+ },
1151
1466
  "wsbShare": {
1152
1467
  "type": "boolean",
1153
1468
  "description": "On Windows 11 24H2+ with the Windows Sandbox command line (wsb), add other folders to the running sandbox with `wsb share` (untested). Otherwise starting a project outside every root offers a restart."
@@ -32,6 +32,24 @@
32
32
  "type": "boolean",
33
33
  "description": "Map this project read-only."
34
34
  },
35
+ "workspaceFilter": {
36
+ "type": "object",
37
+ "properties": {
38
+ "enabled": {
39
+ "type": "boolean",
40
+ "description": "Keep what your .gitignore lists (.env files, node_modules, build output ...) out of the sandbox. The sandbox works on a copy of the project without those files, kept in step with it both ways within about a second; what it creates that is ignored (its own node_modules, builds) stays in the sandbox. Git works as usual. Off = the project folder itself is mapped."
41
+ },
42
+ "exclude": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "string",
46
+ "maxLength": 500
47
+ },
48
+ "description": "Also keep these out, as .gitignore patterns, e.g. secrets/, *.pem, data/private/."
49
+ }
50
+ },
51
+ "additionalProperties": false
52
+ },
35
53
  "mappings": {
36
54
  "type": "array",
37
55
  "items": {
@@ -43,8 +61,10 @@
43
61
  "description": "Folder on this PC (relative paths are relative to the config file)."
44
62
  },
45
63
  "guest": {
64
+ "description": "Where it appears inside the sandbox, e.g. C:\\Assets, or on another drive letter (D: to Z:) such as F:\\SteamLibrary\\steamapps\\common\\Game (shown as F: at boot). Leave it out to use the same path as on this PC (a folder inside the project stays where it is in the project). A path the sandbox cannot use (C:\\Windows\\..., C:\\Users\\..., one already in use) goes to C:\\Mapped\\<drive>\\<path> instead, and the launch says so.",
46
65
  "type": "string",
47
- "description": "Where it appears inside the sandbox, e.g. C:\\Assets, or on another drive letter (D: to Z:) such as F:\\SteamLibrary\\steamapps\\common\\Game: mapped to C:\\Mirror\\F\\... and shown as F: (subst) at boot."
66
+ "minLength": 1,
67
+ "maxLength": 1024
48
68
  },
49
69
  "readOnly": {
50
70
  "type": "boolean",
@@ -57,12 +77,11 @@
57
77
  },
58
78
  "required": [
59
79
  "host",
60
- "guest",
61
80
  "readOnly"
62
81
  ],
63
82
  "additionalProperties": false
64
83
  },
65
- "description": "Extra folders (relative to this file)."
84
+ "description": "Extra folders (relative paths are relative to this file), e.g. a read-only data folder at another place in the sandbox. Folders outside the project are used only as your projects.allowOutsideMappings setting allows (by default you are asked once)."
66
85
  },
67
86
  "scripts": {
68
87
  "type": "array",
@@ -137,6 +156,10 @@
137
156
  "headless": {
138
157
  "type": "boolean",
139
158
  "description": "Hide the sandbox window (sbx-show brings it back). A headless sandbox shuts down when its last session ends."
159
+ },
160
+ "keepAwake": {
161
+ "type": "boolean",
162
+ "description": "Keep this PC from sleeping while a sandbox runs, so agents left working overnight keep going (the screen may still turn off; closing a laptop lid still sleeps it)."
140
163
  }
141
164
  },
142
165
  "additionalProperties": false
@@ -145,7 +168,17 @@
145
168
  "type": "object",
146
169
  "properties": {
147
170
  "blockPrivateRanges": {
148
- "type": "boolean"
171
+ "type": "boolean",
172
+ "description": "Block your LAN (10/8, 172.16/12, 192.168/16, SMB) from inside the sandbox."
173
+ },
174
+ "blockHosts": {
175
+ "type": "array",
176
+ "items": {
177
+ "type": "string",
178
+ "maxLength": 253,
179
+ "pattern": "^([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+$"
180
+ },
181
+ "description": "Never reachable from the sandbox, e.g. production servers or telemetry (each exact name; the sandbox's hosts file sends them nowhere)."
149
182
  }
150
183
  },
151
184
  "additionalProperties": false
@@ -701,6 +734,22 @@
701
734
  "enabled": {
702
735
  "type": "boolean",
703
736
  "description": "Portable VS Code inside the sandbox (code on PATH, desktop shortcut); its settings and extensions persist."
737
+ },
738
+ "setup": {
739
+ "type": "boolean",
740
+ "description": "Point VS Code at the sandbox's own tools (JDK, Python, Go, compilers, .NET, Git, PowerShell 7 and Git Bash terminals) and install the language extensions for the toolchains in use."
741
+ },
742
+ "recommended": {
743
+ "type": "boolean",
744
+ "description": "Also install the extensions a project recommends in its .vscode/extensions.json."
745
+ },
746
+ "extensions": {
747
+ "type": "array",
748
+ "items": {
749
+ "type": "string",
750
+ "pattern": "^[\\w-]+\\.[\\w-]+$"
751
+ },
752
+ "description": "More extensions to install in every sandbox, e.g. eamodio.gitlens, ms-azuretools.vscode-docker."
704
753
  }
705
754
  },
706
755
  "additionalProperties": false
@@ -920,20 +969,86 @@
920
969
  },
921
970
  "additionalProperties": false
922
971
  },
923
- "claudeProfile": {
972
+ "apps": {
924
973
  "type": "object",
925
974
  "properties": {
926
- "enabled": {
927
- "type": "boolean",
928
- "description": "Copy selected Claude settings from this PC into the sandbox."
929
- },
930
- "include": {
975
+ "install": {
931
976
  "type": "array",
932
977
  "items": {
933
978
  "type": "string",
934
- "pattern": "^[A-Za-z0-9._-]+$"
979
+ "enum": [
980
+ "notepadpp",
981
+ "sublime",
982
+ "neovim",
983
+ "dbeaver",
984
+ "pgadmin",
985
+ "heidisql",
986
+ "sqlitebrowser",
987
+ "compass",
988
+ "redisinsight",
989
+ "dbgate",
990
+ "beekeeper",
991
+ "dynamodb-admin",
992
+ "bruno",
993
+ "insomnia",
994
+ "sourcegit",
995
+ "githubdesktop",
996
+ "lazygit",
997
+ "7zip",
998
+ "winmerge",
999
+ "everything",
1000
+ "sysinternals",
1001
+ "imhex",
1002
+ "chrome",
1003
+ "firefox",
1004
+ "godot",
1005
+ "blender",
1006
+ "love",
1007
+ "defold",
1008
+ "pixelorama",
1009
+ "tiled",
1010
+ "kubectl",
1011
+ "helm",
1012
+ "k9s",
1013
+ "terraform",
1014
+ "azure-cli",
1015
+ "gcloud",
1016
+ "aws-cli",
1017
+ "drawio",
1018
+ "pandoc",
1019
+ "mitmproxy",
1020
+ "xh",
1021
+ "grpcurl",
1022
+ "k6",
1023
+ "jq",
1024
+ "yq",
1025
+ "ripgrep",
1026
+ "fd",
1027
+ "bat",
1028
+ "fzf",
1029
+ "delta",
1030
+ "just",
1031
+ "hyperfine",
1032
+ "watchexec",
1033
+ "protoc",
1034
+ "ninja",
1035
+ "ffmpeg",
1036
+ "sqlite",
1037
+ "shellcheck",
1038
+ "gitleaks"
1039
+ ]
935
1040
  },
936
- "description": "Files and folders copied from it."
1041
+ "description": "Apps from the catalogue to install in every sandbox (the Apps screen in the menu lists them by category). Each is downloaded once and kept."
1042
+ }
1043
+ },
1044
+ "additionalProperties": false
1045
+ },
1046
+ "claudeProfile": {
1047
+ "type": "object",
1048
+ "properties": {
1049
+ "enabled": {
1050
+ "type": "boolean",
1051
+ "description": "Copy selected Claude settings from this PC into the sandbox."
937
1052
  },
938
1053
  "overwrite": {
939
1054
  "type": "boolean",
@@ -945,11 +1060,11 @@
945
1060
  },
946
1061
  "syncHistory": {
947
1062
  "type": "boolean",
948
- "description": "Bring all conversation history in, and sync new history back (path-translated)."
1063
+ "description": "Bring conversation history in, and sync new history back (path-translated)."
949
1064
  },
950
1065
  "syncClaudeMem": {
951
1066
  "type": "boolean",
952
- "description": "Bring claude-mem data in, and its database back when the sandbox closes."
1067
+ "description": "Bring claude-mem data into the sandbox (its settings and backups stay on this PC)."
953
1068
  }
954
1069
  },
955
1070
  "additionalProperties": false